我在Java中有以下Utility类。
public class Utils {
private static Properties commonProps;
private Utils() {}
private static setCommonProps(Properties commonProps) {
Utils.commonProps = commonProps;
}
public static boolean staticMethod1() {
commonProps.get("xyz");
}
public static void staticMethod2() {
}
}
我们初始化" commonProps"在Spring函数org.springframework.beans.factory.config.MethodInvokingFactoryBean的帮助下。
这个代码设计有什么问题吗?这有什么不好的影响吗? 对Utility类进行这样的变量初始化是一个好习惯吗?
注意:这里"属性commonProps"只是一个占位符。需要在此类中使用的任何常用成员,必须在启动期间注入。
答案 0 :(得分:2)
一般来说,依赖注入是一件好事,因为它会带来更好的设计,更容易测试。在您的特定情况下,您必须查看您要实现的目标。
您似乎尝试提供单点访问属性,并在标准Java Properties
API上添加一些值。例如,通过提供getBoolean()
等价物。
关于单点访问,您需要考虑线程问题。但是,只要您可以保证在使用静态方法之前配置实用程序类,就应该没问题。
关于扩展Properties
API,您可能更好地使用现有库之一,而不是承担编写和维护自己的库的成本。例如,我发现Apache Commons Configuration非常好。
答案 1 :(得分:1)
静态字段中不要有任何可变性。这是一种反模式。也不要使用Spring注入静态字段。做这些事情会使你的代码难以使用,而且很难测试。
您已经能够使用@Value
在bean中注入包含属性的字段。虽然这不是动态的,但你真的不应该有动态属性(虽然它可能是IMO,但这并不是一个好主意)。将属性视为启动常量或其他内容。他们不应该改变。