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

时间:2010-07-01 14:06:43

标签: java oop

我正在查看代码库,我经常会看到类似的内容:

public class SomeClass
{
 protected static SomeClass myObject;

 //...

 public static SomeClass getObject()
 {
  return myOjbect
 }
}

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

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

谢谢!

5 个答案:

答案 0 :(得分:4)

这称为 Singleton 设计模式。

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

Wikipedia有一篇关于模式的优秀文章。

答案 1 :(得分:4)

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

  

此外,这似乎有点   鸡肉和鸡蛋的定义因为   class包含该类型的对象   班上的。为什么不这样呢   自相矛盾?

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

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

答案 2 :(得分:3)

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

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

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

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

 private SomeClass(){
 //...
 }

 public static SomeClass getObject()
 {
  return myOjbect
 }
}

此处更多,在Wikipedia

您可能需要查看Factory Pattern