Fre*_*Dan 28 java singleton static design-patterns
getInstance()
Java中的目的是什么?
在我的研究过程中,我一直在阅读,这getInstance()
有助于实现Singleton设计模式(这意味着整个程序中只有一个实例符合我的理解).但我不能只使用静态?这不是静止的全部意义吗?
如果我只是有静态方法和字段,它与使用getInstance()
有何不同?是否存在静态的"范围"?例如,每个方法或类一个实例?
如果它们不同,在什么情况下我会选择getInstance()
使用静态?
如果问题不清楚,我很抱歉,我确信我遗漏了一些有关主题的内容,我只是无法弄清楚是什么.
感谢您提供任何建议.
Zac*_*ano 15
静态不会给你一个单身人士.由于无法在Java中将顶级类设为单例,因此您可以使用getInstance方法实现某些逻辑,以确保只有一个类的实例.
public class Singleton {
private static Singleton singleton;
private Singleton(){ }
public static synchronized Singleton getInstance( ) {
if (singleton == null)
singleton=new Singleton();
return singleton;
}
}
Run Code Online (Sandbox Code Playgroud)
看看这个最佳答案:Java中的静态类
上面的代码只允许创建一个实例,并且它很干净,但是从Java 1.6开始,最好创建单独的实例,因为它稍微更优雅恕我直言:
public enum MyEnumSingleton {
INSTANCE;
// other useful methods here
}
Run Code Online (Sandbox Code Playgroud)
资料来源:http://www.vogella.com/tutorials/DesignPatternSingleton/article.html
G.T*_*.T. 10
单例允许您使用对java对象的单个引用.例如,这是一个包含数字的单例;
public class MySingleton {
private int myNumber;
private static MySingleton instance;
public static MySingleton getInstance() {
if (instance == null) {
instance = new MySingleton();
}
return instance;
}
private MySingleton() {}
public void setMyNumber(int myNumber) {
this.myNumber = myNumber;
}
public int getMyNumber() {
return myNumber;
}
}
Run Code Online (Sandbox Code Playgroud)
现在我们要在A类中设置这个数字的值:
public class A {
/*...*/
MySingleton mySingleton = MySingleton.getInstance();
mySingleton.setMyNumber(42);
/*...*/
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以从另一个类访问此值:
public class B {
/*...*/
MySingleton mySingleton = MySingleton.getInstance();
int number = mySingleton.getMyNumber();
/*...*/
}
Run Code Online (Sandbox Code Playgroud)
在这个类中,number
变量的值为42.这是单例优于简单对象的优点:
存储在单例中的所有值都可以从"到处"访问.
目的不同,这里的优点是使用对象而不必创建它.
例如:
public static class MyStaticClass {
public static void sayHello() {
System.out.println("Hello");
}
}
Run Code Online (Sandbox Code Playgroud)
现在,您可以通过调用以下任何类来使用sayHello()方法:
MyStaticClass.sayHello();
Run Code Online (Sandbox Code Playgroud)