当前位置: 首页 > 面试题库 >

如何创建单例课程

乌学博
2023-03-14
问题内容

在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开始就不需要调度一次。用于将变量设置为变量。 但这如何保证在整个应用程序中只创建一个实例呢?有什么我错过的小东西吗?