通过自定义注释注入常量

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)

任何人都知道我会怎么做这个或至少是我想做的最佳实践?

maa*_*nus 2

首先,你不应该这样做。它很实用,但太老套了,如果您想使用不同的设置编写测试,您会遇到问题。而且,没有人会理解它是如何工作的。

注释处理器可能无法为您做任何事情。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 可以完成其工作。那里已经有一些相关的东西:

所以实际上,你可以写

@MyAnnotation
int MY_CONSTANT;
Run Code Online (Sandbox Code Playgroud)

并让您的注释也更改修饰符。我会查看eclipsejavac处理程序@UtilityClass,我想您所需要的只是生成初始化程序(这是相当多的工作,因为它非常复杂)。

我认为 Lombok 本身不会很快实现这一点,因为

  • 所有的static东西都是不可测试的,而且大部分都是糟糕的风格
  • 并不是每个人都希望在他们的代码中使用这个
  • 没有那么多的样板
  • 它还神奇地引用了该类Properties,但这可以通过配置来解决

但我想贡献可能会被接受。