2014-09-21 30 views
0

当您有很多类时,通常需要从另一个类访问一个类的字段/方法。我不是很有经验的Java和我最近发现这个方法,这似乎是非常方便的(不是从一个类传递变量到另一个更好):创建类静态获取器而不是对象链接

class MyClass { 
    private static MyClass _instance = null; 

    public MyClass(){ 
     ... 
    } 

    public static getInstance(){ 
     if (_instance == null) { 
      _instance = new MyClass(); 
     } 
     return _instance; 
    } 
} 

现在在其他任何类,我可以简单地做

MyClass.getInstance().callSomething() 

但是,我没有看到在Internet上找到的Java示例和教程中的其他类的访问方式。这让我想到了,这种方法可能存在一些潜在的问题吗?特别是当你有很多类,因此在每个类中有很多这样的静态调用?

+0

这被称为'Singleton',并且非常用于Java或任何其他面向对象的语言。当你只想要一个类 – 2014-09-21 09:52:29

+0

的单个实例时,你使用它** public static getInstance(){} **甚至有效吗? – Nabin 2014-09-21 09:55:31

+1

这不是一个单例:构造函数是公共的。 @Nabin是对的,它不是一个有效的方法签名。 – 2014-09-21 13:39:19

回答

2

MyClass.getInstance()。callSomething()

但是我没有看到在Java中访问其他类 例子和教程,我在网上找到的这种方式。

您指定的方法是称为Singleton模式的最常用设计模式之一。

在Java中,Singleton模式将确保在Java虚拟机中只创建一个类的实例。它用于提供对象的全局访问点。就实际使用而言,Singleton模式用于日志记录,缓存,线程池,配置设置和设备驱动程序对象。设计模式经常与工厂设计模式结合使用。

但是,您的代码似乎不符合Singleton设计模式的合同。它主要要求你的类只有私有构造函数(以避免其他类实例化)。

public MyClass(){ // Constructor needs to be private 
     ... 
    } 

此外,getInstance()方法似乎不是有效。 试试这个:

public static MyClass getInstance(){ 

建议使用枚举在Java 5或以上版本来实现辛格尔顿。 ENUM是线程安全的并通过枚举实施辛格尔顿确保您的单身将只有一个实例即使是在多线程环境

请点击此链接为Singleton pattern using Enum

详细的了解这是一个很好的链接它可以帮助你understand Singleton pattern in detail.

+0

用于枚举。另请参阅http://stackoverflow.com/questions/70689/what-is-an-efficient-way-to-implement-a-singleton-pattern-in-java – Constantinos 2014-09-21 10:12:35

+0

非常感谢,我想比回答它! – Lez77 2014-09-21 10:41:50