Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:getInstance与Static_Java_Design Patterns_Static_Singleton - Fatal编程技术网

Java:getInstance与Static

Java:getInstance与Static,java,design-patterns,static,singleton,Java,Design Patterns,Static,Singleton,Java中getInstance()的用途是什么 在我的研究过程中,我不断读到getInstance()有助于实现单例设计模式(据我所知,这意味着整个程序中只有一个实例)。但我不能只用静电吗?这不是静电的全部意义吗 如果我只有静态方法和字段,它与使用getInstance()有什么区别?是否存在静态的“范围”?例如,每个方法或类一个实例 如果它们不同,在什么情况下我会选择getInstance()而不是使用static 如果问题不清楚,我很抱歉,我肯定我在主题上遗漏了一些东西,我就是不知道是什么

Java中
getInstance()
的用途是什么

在我的研究过程中,我不断读到
getInstance()
有助于实现单例设计模式(据我所知,这意味着整个程序中只有一个实例)。但我不能只用静电吗?这不是静电的全部意义吗

如果我只有静态方法和字段,它与使用
getInstance()
有什么区别?是否存在静态的“范围”?例如,每个方法或类一个实例

如果它们不同,在什么情况下我会选择
getInstance()
而不是使用static

如果问题不清楚,我很抱歉,我肯定我在主题上遗漏了一些东西,我就是不知道是什么


感谢您提供的所有建议。

我也更喜欢使用
static
,但有时
getInstance()
有助于使用一些与对象相关的函数,您可以在这些函数中修改变量。如果只是制作一些不需要对象实例的util函数,请使用
static


当您使用某人的库时,您永远不知道函数体是否需要类实例。这就是为什么很多库类都在使用
getInstance()

Static不会为您提供单例。由于在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 1.6开始,最好创建singleton实例,因为它稍微优雅一些:

public enum MyEnumSingleton {
    INSTANCE;

    // other useful methods here
} 

来源:

实现单例的确切方法,例如使用名为
getInstance()
的工厂方法,与“静态方法与使用实例方法的单例”的问题无关

类本身实际上是单例的,所以从这一方面来说它们是相似的

主要区别在于静态方法不是类层次结构的一部分,它们不是继承的,这意味着静态方法选项将永远锁定您使用该类,并且不能以任何其他方式引用它,例如某个接口或超类的实现

但是,实例没有此问题,因此您可以编写代码,例如:

class MySingleton implements SomeInterface {
    ...
}

SomeInterface instance = MySingleton.getInstance();
public static class MyStaticClass {
    public static void sayHello() {
        System.out.println("Hello");
    }
}
单身人士 singleton允许您使用对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。这是单例相对于简单对象的优势:

存储在singleton中的所有值都可以从 “无处不在”


静态类 目的不同,这里的优点是使用对象而不必创建它

例如:

class MySingleton implements SomeInterface {
    ...
}

SomeInterface instance = MySingleton.getInstance();
public static class MyStaticClass {
    public static void sayHello() {
        System.out.println("Hello");
    }
}
现在,您可以通过调用以下命令从任何类使用sayHello()方法:

MyStaticClass.sayHello(); 

我更喜欢这个,而不是检查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();
   }
}

完整代码来源:

使用单例而不是静态类成员变量的一个被忽略的原因是,即使在从未实例化类的情况下,静态成员变量也可能使用空间和垃圾收集器时间。考虑RT.jar中有多少类可用,而在任何给定的应用程序中,您可能使用它们的一小部分。还可以考虑使用GETSebug确保您的“构造函数”在访问任何成员变量之前运行。我几乎普遍认为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() );
}

JAVA中没有任何
每个方法都有一个实例。
getInstance()
可以是一个
静态的
方法……对于单例模式,getInstance是一个静态方法,并使用静态属性。静态的全部目的是使事物与类关联,而不是与特定对象关联。singleton模式保证您将拥有该类型对象的一个实例。@谢谢您的评论,getInstance的目的并不是作为访问器。非常感谢您的解释。我最初认为getInstance Java方法(如内置)不是访问器方法。您的getInstance()实现不适合单例。啊,您完全正确:)我从不设置我的实例。我急于下班。抢手货那更好!再次感谢你,波希米亚人这不是我要说的。您的方法不是线程安全的,因此可以创建类的多个实例(即使有设置字段的修复程序),您实际上可以在任何类中具有该行为(即,无论类是否标记为静态,静态方法始终使用类名调用)。内部静态类的主要优点是它不附加到外部类的任何封闭实例。