2012-05-08 47 views
1

我正在经历一段代码,当我遇到这个传来:对象是否可以访问修饰符?

public class ClassicA { 
    private static ClassicA instance = null; 
} 

我从来没有使用过这样的事情,想知道这意味着什么,它是如何使用的。另外,对象的访问修饰符的用途是什么?任何示例/链接都欢迎。

+0

可能在类有一个静态getter方法实例。 – BigMike

回答

4

这可能意味着ClassicA是一个Singleton。它通常涉及声明一个私有构造函数,以及一个公共静态方法getInstance()。当你要确保只有一个在整个应用程序的ClassicA全局实例

单身人士使用。您可以调用getInstance()来检查它是否实例化了一次,而不是实例化它。如果是,它将实例化它,并将结果对象存储在专用instance字段中。如果它已经构建好了,只需返回instance字段而不需要重新实例化。

请注意,这被认为是不好的做法。见:https://softwareengineering.stackexchange.com/questions/40373/so-singletons-are-bad-then-what

+0

嗯,严格地说,这并不意味着这个类是单身人士:可能有一个公共构造函数。我假设类源代码不完整,否则它没有多大意义。 – Vlad

+0

@ Vlad:增加了“可能”。谢谢。 –

+0

@Truth:谢谢,我因此删除了我的评论:-) – noMAD

1

其一个singleton 基本上是作者的意图那里是只有1本类的实例活着(实例字段) 构造可能是私有的,只能在类中使用。

+1

如果你在描述的位置写下,而不是只发布一个链接,它通常会更有帮助。 –

+0

好的,+说明 – radai

1

这是类的(静态)成员,是的,these can have access modifiers。 (正如其他人已经注意到的那样,它确实看起来像一个Singleton的一部分。)

0

这是用于单身模式。见here

+4

我期望从一个10k用户得到更好的答案。 –

+0

@Truth我只关心点:10k用户。 – peeyush

+0

@Truth:那么,如果工作要求,那么SO必须等待。 –

3

那么,类ClassicA有一个私人和静态字段instance它是空的。 如果没有获取者/设置者,访问该字段的唯一方法是使用反射。

由于这看起来像一个单身人士,我猜还有一个吸气人,以及返回instance,如果它为空,首先创建一个实例并将其分配给该字段。

0

private static意味着instance可用于该类的所有实例和静态方法,但仅适用于它们。这实际上就像拥有静态私有方法。

这种技巧可以用于例如用于实现单:你在内部保持一个类的一个实例,你可以把它给类的客户需求。或者当你需要在静态方法和某些类的实例之间共享某些东西时,也可以用于其他任何情况。

1

这通常用于展示Singleton design pattern的类。

问题是,对于这些类型的对象,最多只需要一个实例。你所做的是为类创建一个私有构造函数,然后通常使用一个名为getInstance的公共静态方法,在该方法中你检查私有实例变量是否已被设置。如果它尚未设置,则创建该类的新实例并将其分配给实例,然后返回该实例。如果该对象已经创建,则只需返回它。像这样:

public class MySingleton { 

    private static MySingleton instance=null; 
    private MySingleton() { 
    //do stuff 
    } 

    public static MySingleton getInstance() { 
    if (instance == null) { 
     instance = new MySingleton(); 

    } 
    return instance; 
    } 

} 

然后从整个程序中,你可以很容易地从任何地方获得单身对象。

因此,一个单例实际上只是像PHP这样的语言中的一个荣耀的全局变量。我认为它会更清晰,因为您可以防止其他人重新分配对实例的引用以及从设计角度来看可能非常糟糕的其他欺骗。

,通常人们将它用于管理一些类型的数据访问,如DB对象,工厂类和建设者班班见this更多信息

+0

请注意比赛条件... – yshavit

+0

public syncrhonized?或者只是使用synchronized(MySingleton.class)?围绕getInstance? –

+0

这将做到这一点(两者基本相当),但它会增加一个同步瓶颈(这可能不是什么大问题)。另一种方法是执行[双重检查锁定](http://en.wikipedia.org/wiki/Double-checked_locking#Usage_in_Java) - 但请特别注意需要将“instance”设置为“volatile”。但最好的方法可能不是延迟加载:'private static MySingleton instance = new MySingleton()'。该初始化程序本身是懒惰加载的(它只在加载类时运行,这是您第一次使用它时),它应该足够好。 – yshavit