在Java中创建静态单例模式
我正在创建一个实用程序类,该类将用于创建绑定到当前线程的新org.mozilla.javascript.Context对象。我有一个全局JavaScript作用域,它可能有几个导入/初始化语句,等等 我希望外部类能够通过简单地使用Utility.getContext和Utility.getScope来检索上下文对象和范围对象,以便将来执行,而不必显式地使用getInstance函数。singleton模式是必需的,因为上下文和范围都需要是单个实例 下面的代码有意义吗在Java中创建静态单例模式,java,javascript,scope,singleton,Java,Javascript,Scope,Singleton,我正在创建一个实用程序类,该类将用于创建绑定到当前线程的新org.mozilla.javascript.Context对象。我有一个全局JavaScript作用域,它可能有几个导入/初始化语句,等等 我希望外部类能够通过简单地使用Utility.getContext和Utility.getScope来检索上下文对象和范围对象,以便将来执行,而不必显式地使用getInstance函数。singleton模式是必需的,因为上下文和范围都需要是单个实例 下面的代码有意义吗 public class U
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;挑一个。你真的不需要两者兼而有之;事实上,让所有实例都修改相同的共享状态,但看起来是分开的,这会在以后对你造成伤害。