gpt4 book ai didi

java - 在哪里初始化 java Properties 对象?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:52:29 26 4
gpt4 key购买 nike

我继承了一个应用程序,它使用 java 属性文件来定义配置参数,例如数据库名称。

有一个名为 MyAppProps 的类,如下所示:

public class MyAppProps {

protected static final String PROP_FILENAME = "myapp.properties";
protected static Properties myAppProps = null;

public static final String DATABASE_NAME = "database_name";
public static final String DATABASE_USER = "database_user";
// etc...

protected static void init() throws MyAppException {
try {
Classloader loader = MyAppException.class.getClassLoader();
InputStream is = loader.getResourceAsStream(PROP_FILENAME);
myAppProps = new Properties();
myAppProps.load(is);
} catch (Exception e) {
threw new MyAppException(e.getMessage());
}
}

protected static String getProperty(String name) throws MyAppException {
if (props==null) {
throw new MyAppException("Properties was not initialized properly.");
}
return props.getProperty(name);
}
}

其他需要获取属性值的类包含如下代码:

String dbname = MyAppProps.getProperty(MyAppProps.DATABASE_NAME);

当然,在第一次调用MyAppProps.getProperty之前,MyAppProps需要这样初始化:

MyAppProps.init();

我不喜欢需要调用 init() 的事实。初始化不应该在静态初始化 block 或私有(private)构造函数中进行吗?

除此之外,代码似乎还有其他问题,我无法完全确定。属性实例通常包装在自定义类中吗?这里还有什么不对的地方吗?

最佳答案

如果我像这样制作自己的包装类;我总是喜欢为值创建强类型的 getter,而不是通过静态最终变量公开所有内部工作。

private static final String DATABASE_NAME = "database_name"
private static final String DATABASE_USER = "database_user"
public String getDatabaseName(){
return getProperty(MyAppProps.DATABASE_NAME);
}
public String getDatabaseUser(){
return getProperty(MyAppProps.DATABASE_USER);
}

静态初始化器看起来像这样;

static {
init();
}

话虽这么说,但我很乐意说我不是静态初始化器的忠实拥护者。

您可以考虑研究像 spring 或 guice 这样的依赖注入(inject) (DI) 框架,它们可以让您将适当的值直接注入(inject)到您需要使用它们的地方,而不是通过附加类的间接访问。很多人发现使用这些框架可以减少对这种管道代码的关注——但前提是你已经完成了框架的学习曲线。 (DI 框架学起来很快,但要花很多时间才能掌握,所以这可能比你真正想要的更大)

关于java - 在哪里初始化 java Properties 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/376798/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com