有人知道加载属性文件并动态创建与键值同名的字符串的方法吗?
我试图通过将所有系统消息等从逻辑中移出并移入属性文件来清理我的代码,但希望避免必须有一个由数十行组成的类,如下所示:
final String COMMS_ERROR = properties.getProperty(COMMS_ERROR);
我想要实现的目标的一个例子:
for (String key : properties.getPropertyValues()) {
final String <key> = properties.getProperty(key)
}
显然这是行不通的,编译器会抛出异常。但我想知道是否有一个优雅的解决方案可以做同样的事情 - 使用属性文件中的键名称创建新字符串 - 无论是通过单独的库还是在我自己的代码中。
我想到的一个解决方案是使用属性文件中的键/值填充 HashMap,但这意味着以下形式的代码不太优雅:
import com.x.y.messages;
...
throw new Exception(HM.get("COMMS_ERROR"));
HM 是位于 com.x.y.messages 内的 HashMap...
理想情况下我只想能够做到:
import com.x.y.messages;
....
throw new Exception(COMMS_ERROR);
任何想法/建议表示赞赏。
最佳答案
如果这些属性在编译后可以更改(如果不能,那么为什么要使用它们),您将没有机会动态创建和使用这些字符串。当然,有一些方法可以动态创建代码(例如 AOP 运行时编织),但该代码在正常编译过程中无法使用。
那么编译器如何知道 COMMS_ERROR
实际上存在于这一行 throw new Exception(COMMS_ERROR);
?它不能,因此您需要选择 HashMap
方法。请注意Properties
实际上是一个Map<String, String>
(好吧,从 Java 6 开始它是 Hashtable<Object, Object>
但它的作用类似于 Map<String, String>
),因此不需要创建一个新的。
编辑:您可以使用静态导入,如下所示:
package yourpackage;
public class Props
{
private static Properties props;
public static String prop(String prop)
{
return props.getProperty( prop );
}
}
像这样使用它:
import static yourpackage.Props.prop;
....
prop("someKey");
请注意,静态导入有其缺点,例如看起来这些方法是它使用的类的一部分,因此我只想提供一种替代方案,让您决定是否使用它。
关于java - 从 Java 中的属性文件动态填充字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7267701/