当前位置: 代码迷 >> java >> 同一类型的类中的Java成员对象
  详细解决方案

同一类型的类中的Java成员对象

热度:71   发布时间:2023-08-02 10:46:44.0

我正在寻找一个代码库,我经常看到类似的东西:

public class SomeClass
{
 protected static SomeClass myObject;

 //...

 public static SomeClass getObject()
 {
  return myOjbect
 }
}

我想确保理解这背后的目的。 它是否确保一个类的实例共享,即使它被多次实例化? 我不确定这里的词汇,否则我会搜索答案,所以如果这个模式有名字,请告诉我。

此外,这似乎有点鸡和蛋的定义,因为该类包含类的类型的对象。 为什么这不是荒谬的?

谢谢!

这称为Singleton设计模式。

你说的目的是确保只创建一个类的实例是正确的。

有关该模式的优秀文章。

这实际上只适用于 ,其中只有一个类的实例。 虽然它有其用途,但Singleton经常被滥用和滥用(通常将程序编程伪装成OO)。 它也经常出现在Java AWT或Swing的示例代码中,您通常在其中继承Frame / JFrame ,并在同一个类内的main方法中创建实例。

此外,这似乎有点鸡和蛋的定义,因为该类包含类的类型的对象。 为什么这不是荒谬的?

为什么你认为它是? 该类主要描述了此类型的成员实例 - 但static成员不属于实例,它属于类本身,因此它与类的“蓝图”角色没有任何关系。 因为这个原因,静态成员实际上有点不合适。

但即使在实例级别,您也可以使用相同类型的引用。 例如,链表中的条目通常具有对下一个和前一个条目的两个引用,这些条目属于同一类。

您提到的模式称为“Singleton”,但是从您的代码示例中不清楚这是否真的是预期的。 由于成员受到保护,我猜不会 - 如果有子类,则可能没有单个实例。

这并不罕见; 它可以是实现模式的好方法。 也可以有其他用途 - 有时候你会想要一些 - 而不是更多 - 给定类的对象; 这个班级是一个很好的地方。 如果您不希望其他类能够创建此类的对象,则通常也会为该类提供私有构造函数。

这并不矛盾,因为编译器在完全编译类之前可以知道对类的引用。 后来 - 如果你想以这种方式思考它 - 它可以“填补空白”。

它叫做Singleton。 您确保只创建给定类的ONE(1)对象。

您应该添加一个私有的构造函数,因此唯一创建该对象的是该类。

public class SomeClass
{
 // Using private constructor
 protected static SomeClass myObject = new SomeClass();

 private SomeClass(){
 //...
 }

 public static SomeClass getObject()
 {
  return myOjbect
 }
}

在这里还有更多

您可能想看看

  相关解决方案