相同类型的类内的Java成员对象

相同类型的类内的Java成员对象,java,oop,Java,Oop,我正在查看代码库,我经常看到如下内容: public class SomeClass { protected static SomeClass myObject; //... public static SomeClass getObject() { return myOjbect } } 我想确保我明白这背后的目的。即使类被多次实例化,是否也要确保共享该类的一个实例?我不确定这里的词汇,否则我会搜索答案,所以如果这个模式有名称,请让我知道 此外,这似乎是一个有点鸡毛蒜皮的定

我正在查看代码库,我经常看到如下内容:

public class SomeClass
{
 protected static SomeClass myObject;

 //...

 public static SomeClass getObject()
 {
  return myOjbect
 }
}
我想确保我明白这背后的目的。即使类被多次实例化,是否也要确保共享该类的一个实例?我不确定这里的词汇,否则我会搜索答案,所以如果这个模式有名称,请让我知道

此外,这似乎是一个有点鸡毛蒜皮的定义,因为该类包含该类类型的对象。为什么这实际上不是自相矛盾的


谢谢

您提到的模式被称为“Singleton”,但从您的代码示例来看,不清楚这是否真的是您想要的。由于成员是受保护的,我想不会-如果有子类,那么可能不会有一个实例。

这并不少见;这可能是实现该模式的一个好方法。也可以有其他用途——有时你会想要一个给定类的少数对象,而不是更多的对象;那门课是留住他们的好地方。如果您不希望其他类能够创建该类的对象,那么通常也会为该类提供一个私有构造函数


这并不矛盾,因为编译器可以在完全编译类之前知道对类的引用。稍后—如果您愿意这样想—它可以“填补空白”。

这称为单例设计模式

您正确地指出,这样做的目的是确保只创建类的一个实例


有一篇关于这个模式的很好的文章。

它被称为Singleton。确保只创建给定类的一(1)个对象

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

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

 private SomeClass(){
 //...
 }

 public static SomeClass getObject()
 {
  return myOjbect
 }
}
在这里,还有很多


您可能想看看

这实际上只在只有一个类实例的情况下才常见。虽然Singleton有它的用途,但它被过度使用和误用的情况比没有更多(通常将过程编程伪装成OO)。它也经常出现在Java AWT或Swing的示例代码中,您通常将
Frame
/
JFrame
子类化,并在同一类中的
main
方法中创建实例

而且,这似乎有点 鸡和蛋的定义是因为 类包含类型为的对象 是班上最好的学生。为什么这不是真的 矛盾的

你认为这是为什么?该类主要描述这种类型的成员实例有哪些-但是
静态
成员不属于实例,它属于类本身,因此它与类的“蓝图”角色无关。因此,静态成员实际上有点不面向对象

但即使在实例级别,也可以有相同类型的引用。例如,链表中的一个条目通常会有两个对同一类的下一个和上一个条目的引用