在Java中创建单例类的最佳/正确方法是什么?
我发现的实现之一是使用私有构造函数和getInstance()方法。
package singleton;
public class Singleton {
private static Singleton me;
private Singleton() {
}
public static Singleton getInstance() {
if (me == null) {
me = new Singleton();
}
return me;
}
}
但是在以下测试案例中实现失败吗?
package singleton;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class Test {
/**
* @param args
* @throws NoSuchMethodException
* @throws SecurityException
* @throws InvocationTargetException
* @throws IllegalAccessException
* @throws InstantiationException
* @throws IllegalArgumentException
*/
public static void main(String[] args) throws SecurityException,
NoSuchMethodException, IllegalArgumentException,
InstantiationException, IllegalAccessException,
InvocationTargetException {
Singleton singleton1 = Singleton.getInstance();
System.out.println(singleton1);
Singleton singleton2 = Singleton.getInstance();
System.out.println(singleton2);
Constructor<Singleton> c = Singleton.class
.getDeclaredConstructor((Class<?>[]) null);
c.setAccessible(true);
System.out.println(c);
Singleton singleton3 = c.newInstance((Object[]) null);
System.out.println(singleton3);
if(singleton1 == singleton2){
System.out.println("Variable 1 and 2 referes same instance");
}else{
System.out.println("Variable 1 and 2 referes different instances");
}
if(singleton1 == singleton3){
System.out.println("Variable 1 and 3 referes same instance");
}else{
System.out.println("Variable 1 and 3 referes different instances");
}
}
}
如何解决呢?
谢谢
根据对您的问题的评论:
我有一个包含一些键值对的属性文件,这是整个应用程序所需要的,这就是为什么我在考虑单例类。
此类将从文件中加载属性并将其保留,您可以在应用程序中的任何位置使用它
不要使用单例。您显然不需要一次性的 延迟 初始化(这就是单例的全部内容)。您需要一次性 直接 初始化。只需使其静态并加载到静态初始化程序中即可。
例如
public class Config {
private static final Properties PROPERTIES = new Properties();
static {
try {
PROPERTIES.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("config.properties"));
} catch (IOException e) {
throw new ExceptionInInitializerError("Loading config file failed.", e);
}
}
public static String getProperty(String key) {
return PROPERTIES.getProperty(key);
}
// ...
}
日期:2020/12/17 创盛视联数码科技(北京)有限公司 1. 创建课堂 点击创建课堂,填写课堂相关信息、选择房间类型,保存即可,如下图所示: 1.1. 基本信息 课堂名称 需100个字符以内(1个汉字、数字、标点都算1个字符)。 课堂布局模式 决定课堂页面的默认布局。主要分为文档模式与大屏模式。 课堂连麦模式 学生进入房间后自动连麦。 合流布局模式 设置旁听者以及回放观看时的视频合屏布局,有
我正在使用java创建一个类,这是一个理解对象、方法等的基本类...无论如何,类名是学生,它应该为每个新创建的对象分配一个学生ID。学生ID从1000000开始,递增1,所以每个新对象都应该为类分配一个学生ID,10000001, 100000002等等。 然而,当我创建这个类的对象时,学生ID一直给每个人相同的学生编号10000000。请帮忙
问题内容: 我最近读到,使类成为单例使不可能模拟该类的对象,这使得测试其客户端变得困难。我无法立即理解其根本原因。有人可以解释一下什么使得模拟单例课程成为不可能吗?另外,使类单例还有其他问题吗? 问题答案: 当然,我可以写一些类似 不使用单例的 东西 ,它们很邪恶,使用Guice / Spring /什么都可以, 但是首先,这不能回答您的问题,其次,当您使用遗留代码 来 处理单例时,例。 因此,我
问题内容: 编辑已 解决 :如何在GoLang中创建单例DBManager类。 我参考了一些有关如何创建单例的代码示例,但是我希望在其中包含方法,并在其单例引用中对其进行调用。我的代码如下 通过新答案,我更新了此问题,包括答案。 但是我有一些疑问。如何从gorm.Create(..)进行Cathc并返回异常 问题答案: 一种方法是使用这些方法创建一个导出的接口,并使实现类型不导出。创建接口类型的全
我正在快速有效地学习单例模式来创建单例类,并找到了如下创建的最佳方法。 因为我使用了语句,所以它是只读属性,必须是线程安全的,所以从目标C开始就不需要调度一次。用于将变量设置为变量。 但这如何保证在整个应用程序中只创建一个实例呢?有什么我错过的小东西吗?