繁体   English   中英

如何在Java中基于属性文件调用单例类的实例?

[英]How can I call an instance of a singleton class based on a properties file in java?

我有一个快速的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);
        }
    }
}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM