Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/374.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中创建静态单例模式_Java_Javascript_Scope_Singleton - Fatal编程技术网

在Java中创建静态单例模式

在Java中创建静态单例模式,java,javascript,scope,singleton,Java,Javascript,Scope,Singleton,我正在创建一个实用程序类,该类将用于创建绑定到当前线程的新org.mozilla.javascript.Context对象。我有一个全局JavaScript作用域,它可能有几个导入/初始化语句,等等 我希望外部类能够通过简单地使用Utility.getContext和Utility.getScope来检索上下文对象和范围对象,以便将来执行,而不必显式地使用getInstance函数。singleton模式是必需的,因为上下文和范围都需要是单个实例 下面的代码有意义吗 public class U

我正在创建一个实用程序类,该类将用于创建绑定到当前线程的新org.mozilla.javascript.Context对象。我有一个全局JavaScript作用域,它可能有几个导入/初始化语句,等等

我希望外部类能够通过简单地使用Utility.getContext和Utility.getScope来检索上下文对象和范围对象,以便将来执行,而不必显式地使用getInstance函数。singleton模式是必需的,因为上下文和范围都需要是单个实例

下面的代码有意义吗

public class Utility {
    private static Utility instance;
    private static ScriptableObject scope = null;

    private Utility() {}

    private static Utility getInstance() {
        synchronized (Utility.class) {
            if (instance == null)
                instance = new Utility();
            return instance;
        }
    }

    private static Context getSingletonContext() {
        Context context = Context.getCurrentContext();
        if (context == null)
            context = Context.enter();
        if (scope == null) {
            scope = new ImporterTopLevel(context);
            Script script = context.compileString("Global JavaScript Here","Script Name",1,null);
            script.exec(context,scope);
            scope.sealObject();
        }
        return context;
    }

    public static Context getContext() {
        return getInstance().getSingletonContext();
    }

    public static Scriptable getScope() {
        Scriptable newScope = getContext().newObject(scope);
        newScope.setPrototype(scope);
        newScope.setParentScope(null);
        return newScope;
    }
}
一,。公开

public static Utility getInstance()
二,。除了这个getInstance方法之外,不需要使类中的所有方法都是静态的

三,。当您尝试在其他类中访问该类的singleton对象时,请按此方式进行

Utility ut = Utility.getInstance();
这就是为什么不需要将实用程序类中的方法设置为除getInstance之外的静态方法的原因

四,。单身有三种方式

一,。同步方法

二,。带有双重检查锁定的同步语句

iii.在定义时间初始化静态对象引用变量

例如:

在定义时初始化静态对象引用变量

一,。公开

public static Utility getInstance()
二,。除了这个getInstance方法之外,不需要使类中的所有方法都是静态的

三,。当您尝试在其他类中访问该类的singleton对象时,请按此方式进行

Utility ut = Utility.getInstance();
这就是为什么不需要将实用程序类中的方法设置为除getInstance之外的静态方法的原因

四,。单身有三种方式

一,。同步方法

二,。带有双重检查锁定的同步语句

iii.在定义时间初始化静态对象引用变量

例如:

在定义时初始化静态对象引用变量


您似乎没有上下文和作用域单例上的锁,因此您无法保证这些将是单例。也许更适合将.Java和JavaScript结合在一起?Java-Exception.您似乎没有上下文和作用域单例上的锁,因此无法保证这些将是单例。也许更适合将.Java和JavaScript放在一起?Java语言+1。并且,请不要使用@alfasin:Double-checked锁定从1.5开始就起作用,只要实例字段是可变的。当从其他类引用我的类时,我希望能够直接调用getContext和getScope,而不必调用getInstance。由于这些方法完全独立于应用程序中的任何其他方法,因此静态定义更有意义,对吗?赵,是的,但这是一种糟糕的做法TMHO。为什么不使用最简单、最容易实现和理解的第三个选项?@user1533553:Static class或singleton;挑一个。你真的不需要两者兼而有之;事实上,如果所有实例都修改了相同的共享状态,但看起来是分开的,那以后会让你难堪的。并且,请不要使用@alfasin:Double-checked锁定从1.5开始就起作用,只要实例字段是可变的。当从其他类引用我的类时,我希望能够直接调用getContext和getScope,而不必调用getInstance。由于这些方法完全独立于应用程序中的任何其他方法,因此静态定义更有意义,对吗?赵,是的,但这是一种糟糕的做法TMHO。为什么不使用最简单、最容易实现和理解的第三个选项?@user1533553:Static class或singleton;挑一个。你真的不需要两者兼而有之;事实上,让所有实例都修改相同的共享状态,但看起来是分开的,这会在以后对你造成伤害。