Java:getInstance vs Static
Java中getInstance()
的目的是什么?
在我的研究过程中,我继续阅读getInstance()
有助于实现Singleton设计模式(这意味着整个程序中只有一个实例可供我理解)。 但我不能只使用静态? 这不是静止的全部意义吗?
如果我只是有静态方法和字段,它与使用getInstance()
什么不同? 是否存在静态的“范围”? 例如,每个方法或类一个实例?
如果它们不同,在什么情况下我会选择getInstance()
不是使用静态?
如果问题不清楚,我很抱歉,我确信我遗漏了一些有关主题的内容,我无法弄明白是什么。
感谢您提供任何建议。
静态不会给你一个单身人士。 由于无法在Java中将顶级类设为单例,因此您可以使用getInstance方法实现某些逻辑,以确保只有一个类的实例。
public class Singleton { private static Singleton singleton; private Singleton(){ } public static synchronized Singleton getInstance( ) { if (singleton == null) singleton=new Singleton(); return singleton; } }
看看这个最佳答案: Java中的静态类
上面的代码只允许创建一个实例,并且它很干净,但是从Java 1.6开始,最好是创建单独的实例,因为它稍微更优雅恕我直言:
public enum MyEnumSingleton { INSTANCE; // other useful methods here }
资料来源: http : //www.vogella.com/tutorials/DesignPatternSingleton/article.html
独生子
单例允许您使用对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; } }
现在我们要在A类中设置这个数字的值:
public class A { /*...*/ MySingleton mySingleton = MySingleton.getInstance(); mySingleton.setMyNumber(42); /*...*/ }
然后,您可以从另一个类访问此值:
public class B { /*...*/ MySingleton mySingleton = MySingleton.getInstance(); int number = mySingleton.getMyNumber(); /*...*/ }
在这个类中, number
变量的值为42.这是单例相对于简单对象的优点:
存储在单例中的所有值都可以从“到处”访问。
静态类
目的不同,这里的优点是使用对象而不必创建它。
例如:
public static class MyStaticClass { public static void sayHello() { System.out.println("Hello"); } }
现在,您可以通过调用以下方法从任何类中使用sayHello()方法:
MyStaticClass.sayHello();
实现单例的确切方法,例如使用名为getInstance()
的工厂方法,与问题无关,即“静态方法与单例和实例方法”。
类本身就是有效的单例,所以从这个方面来看它们是相似的。
主要区别在于静态方法不是类层次结构的一部分 – 它们不是inheritance的,这意味着静态方法选项会永远锁定您使用该类,并且不能以任何其他方式引用它,例如实现某些界面或超类。
但实例没有此问题,因此您可以编写代码示例:
class MySingleton implements SomeInterface { ... } SomeInterface instance = MySingleton.getInstance();
我也喜欢使用static
,但有时候getInstance()
有助于拥有一些与对象相关的函数,在这些函数中你可以修改变量。 如果您只是制作一些不需要对象实例的util函数,请使用static
。
当您使用某人的库时,您永远不知道函数体是否需要类实例。 这就是为什么很多库类都在使用getInstance()
。
而不是检查null,我更喜欢这个。
public class SingleObject { //create an object of SingleObject private static SingleObject instance = new SingleObject(); //make the constructor private so that this class cannot be //instantiated private SingleObject(){} //Get the only object available public static SingleObject getInstance(){ return instance; } }
叫……
public class SingletonPatternDemo { public static void main(String[] args) { //illegal construct //Compile Time Error: The constructor SingleObject() is not visible //SingleObject object = new SingleObject(); //Get the only object available SingleObject object = SingleObject.getInstance(); } }
完整代码来自: http : //www.tutorialspoint.com/design_pattern/singleton_pattern.htm
使用单例而不是静态类成员变量的一个被忽视的原因是静态成员变量可能使用空间和垃圾收集器时间,即使在从未实例化类的情况下也是如此。 考虑在rt.jar中可以使用多少个类,以及在任何给定的应用程序中可能使用的它们中的一小部分。 还要考虑使用getInstance确保在访问任何成员变量之前运行“构造函数”。 我几乎普遍认为getInstance是同步的,但我觉得这是一个坏主意。 如果有人曾经将同步的阻塞方法调用添加到Singleton.getInstance()中,那么unsynchronized()可能会被不必要地阻止。
private static Singleton instance = null; private Singleton() {} public final static Singleton getInstance() { return (instance != null) ? instance : makeInstance(); } private final static synchronized Singleton makeInstance() { return ( instance != null ) ? instance : ( instance = new Singleton() ); }