java - 如何根据java中的属性文件调用单例类的实例?

标签 java properties junit singleton instance

我有一个关于 Java 的简单问题。哦,我对 Java 和 stackoverflow 都很陌生,所以请体谅:)

让我尝试更好地解释我的问题。所以我有两个遵循单例模式的类,例如 A 类和 B 类:

public class A
{
    private static final A INSTANCE = new A()

    public static A getInstance()
    {
         return A.INSTANCE;
    }
}

public class B
{
    private static final B INSTANCE = new B()

    public static B getInstance()
    {
         return B.INSTANCE;
    }
}

现在我正在从另一个类访问这些类的实例,假设是 C:

public class testClassC
{
    A class_instance = A.getInstance();
    //or
    //B class_instance = B.getInstance();
}

我想要实现的是这个(此时语法可能完全错误,我一直在尝试不同的东西,但没有一个对我有用):

有一个 .properties 文件,如下所示:

 className=A

然后以某种方式从该属性文件中读取类名,以便当我将 A 更改为 B 时,我的 testClassC 将为我提供 B 的实例。

我怎样才能实现这个目标?哦,再说一遍 testClassC 是一个测试类,我有一大堆 JUnit 测试类,那么解决这个问题的最佳方法是什么?

谢谢

最佳答案

这是一个使用抽象工厂模式的示例。

您有一个定义您的类的接口(interface) - 您需要它来抽象实际的实现。

然后您就有了一个工厂接口(interface),它定义了 newInstance 方法。这使得将单例模式替换为工厂模式变得非常容易。它还使得更改工厂实现以进行测试变得容易。

interface MyInterface {
}

interface MyInterfaceFactory {

    MyInterface newInstance();
}

class MyInterfaceFactoryFromProperties implements MyInterfaceFactory {

    final Class<? extends MyInterface> myInterfaceImpl;

    {
        final Properties properties = new Properties();
        try {
            properties.load(MyInterfaceFactoryFromProperties.class.getResourceAsStream("className.properties"));
        } catch (IOException ex) {
            throw new ExceptionInInitializerError(ex);
        }
        final String className = properties.getProperty("class.name");
        try {
            myInterfaceImpl = (Class<? extends MyInterface>) MyInterfaceFactoryFromProperties.class.forName(className);
        } catch (ClassNotFoundException ex) {
            throw new ExceptionInInitializerError(ex);
        }
    }

    @Override
    public MyInterface newInstance() {
        try {
            return myInterfaceImpl.newInstance();
        } catch (InstantiationException ex) {
            throw new RuntimeException(ex);
        } catch (IllegalAccessException ex) {
            throw new RuntimeException(ex);
        }
    }
}

因此,您的工厂实现将遵循此模式,但您可以例如缓存该值以使其成为单例。

此方法从类路径加载属性文件 - 显然这可以更改为文件系统位置。

关于java - 如何根据java中的属性文件调用单例类的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16157714/

相关文章:

java - 无法使用 Singleton 类在 IntelliJ IDEA 中的属性文件中使用访问属性

java - Junit 中每个方法的 Mock System.class

android - 无法使用 Robolectric 编译测试

java - 如何检查 WebSocket 是否已连接

swift - 覆盖 Swift 子类中的属性

java - Spring Data JPA 审核功能在我的项目中不起作用

java - 有没有办法使用 Java Properties 读取 mime 类型文件?

java: OutOfMemoryError: 在 Idea 中运行 JUnits 时内存不足

java - 具有多个值的键可以通过两种方式访问​​JAVA

java - 重命名 Derby 架构