Ell*_*ael 6 java annotations lombok
我的代码中有一堆常量,用于我系统的各种可调属性.我正在将它们全部移动到中央.properties文件中.我目前的解决方案是有一个Properties.java静态加载.properties文件并公开各种getter方法,如下所示:
public class Properties {
private static final String FILE_NAME = "myfile.properties";
private static final java.util.Properties props;
static {
InputStream in = Properties.class.getClassLoader().getResourceAsStream(
FILE_NAME);
props = new java.util.Properties();
try {
props.load(in);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static String getString(Class<?> cls, String key) {
return props.getProperty(cls.getName() + '.' + key);
}
public static int getInteger(Class<?> cls, String key) {
return Integer.parseInt(getString(cls, key));
}
public static double getDouble(Class<?> cls, String key) {
return Double.parseDouble(getString(cls, key));
}
}
Run Code Online (Sandbox Code Playgroud)
唯一的问题是,对于我从这个文件得到的每个常量,我有一些样板:
private final static int MY_CONSTANT = Properties.getInteger(
ThisClass.class, "MY_CONSTANT");
Run Code Online (Sandbox Code Playgroud)
我认为我不想使用Spring之类的东西,因为它看起来更像是一个锅炉.我希望使用自定义注释来解决问题.我找到了本教程,但我无法理解如何从注释处理中获得我想要的功能.Java文档甚至没那么有用.不过,这应该是我在编译时应该做的事情.我知道班级和领域的名字.
我在想的是这样的:
@MyAnnotation
private static final int MY_CONSTANT;
Run Code Online (Sandbox Code Playgroud)
任何人都知道我会怎么做这个或至少是我想做的最佳实践?
首先,你不应该这样做。它很实用,但太老套了,如果您想使用不同的设置编写测试,您会遇到问题。而且,没有人会理解它是如何工作的。
注释处理器可能无法为您做任何事情。Lombok 风格的黑客处理器可以。你想做
@MyAnnotation
private static final int MY_CONSTANT;
Run Code Online (Sandbox Code Playgroud)
工作就像
private final static int MY_CONSTANT =
Properties.getInteger(ThisClass.class, "MY_CONSTANT");
Run Code Online (Sandbox Code Playgroud)
原始表达式无法编译(由于未初始化的最终变量),但它可以很好地解析并且 Lombok 可以完成其工作。那里已经有一些相关的东西:
final privatestatic所以实际上,你可以写
@MyAnnotation
int MY_CONSTANT;
Run Code Online (Sandbox Code Playgroud)
并让您的注释也更改修饰符。我会查看eclipse和javac处理程序@UtilityClass,我想您所需要的只是生成初始化程序(这是相当多的工作,因为它非常复杂)。
我认为 Lombok 本身不会很快实现这一点,因为
static东西都是不可测试的,而且大部分都是糟糕的风格Properties,但这可以通过配置来解决但我想贡献可能会被接受。
| 归档时间: |
|
| 查看次数: |
1084 次 |
| 最近记录: |