gpt4 book ai didi

java - 通过自定义注解注入(inject)常量

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:25:13 33 4
gpt4 key购买 nike

我的代码中有一堆常量,用于我系统的各种可调整属性。我将它们全部移动到中央 .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));
}
}

唯一的问题是,对于我从这个文件中获得的每个常量,我都有一些样板文件:

private final static int MY_CONSTANT = Properties.getInteger(
ThisClass.class, "MY_CONSTANT");

我不认为我想使用 Spring 或类似的东西,因为它看起来更像样板。我希望使用自定义注释来解决这个问题。我找到了 this tutorial ,但我无法真正弄清楚如何从注释处理中获得我想要的功能。 Java 文档的帮助就更少了。不过,这应该是我应该能够在编译时做的事情。我知道类名和字段名。

我的想法是这样的:

@MyAnnotation
private static final int MY_CONSTANT;

有人知道我将如何着手做这件事,或者至少知道我想做的事情的最佳实践吗?

最佳答案

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

注释处理器可能无法为您做任何事情。一个 Lombok 风格的黑客处理器可以。你想做

@MyAnnotation
private static final int MY_CONSTANT;

工作方式

private final static int MY_CONSTANT =
Properties.getInteger(ThisClass.class, "MY_CONSTANT");

原始表达式无法编译(由于未初始化的 final 变量),但它可以很好地解析并且 Lombok 可以完成它的工作。那里已经有一些相关的东西:

所以实际上,你可以这样写

@MyAnnotation
int MY_CONSTANT;

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

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

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

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

关于java - 通过自定义注解注入(inject)常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29197149/

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