最近我尝试以使用Picocli实现命令行应用程序。该库使用注释定义命令,选项等。
我以前从未研究过注解,而这个库激起了我的好奇心。现在,我正在尝试自己的事情,我不禁要问:如果我需要一个对象来纯粹存储数据,那么创建一个类或定义一个注释会更好吗?
现在,我知道您需要进行反射才能在运行时访问批注,这非常昂贵。但要说您一次加载它们并将它们存储在内存中;例如在Set<@Option>
中。它们会比普通物体亮多少?
例如:
@Target( { ElementType.FIELD, ElementType.METHOD} ) @Retention(RetentionPolicy.RUNTIME)
public @interface Option {
String DEFAULT_STRING = "";
String name();
String description() default DEFAULT_STRING;
String [] params() default {};
}
vs。
public class Option {
private final String name;
private String description;
private String [] params;
public Option(String name) {
this.name = name;
}
public Option (String name, String description, String [] params) {
this(name);
this.description = description;
this.params = Arrays.copyOf(params, params.length);
}
// Getters & Setters
}
然后...
public class Foo {
@Option(name = "var", description = "var description")
private boolean var;
public Foo() {
Option option = new Option("var", "var description", new String[0]);
}
}
与具有普通字段的自定义类相比,注释将占用更多的内存。这是因为注释是一个接口,并且Java将为每个具有RUNTIME保留的注释实例生成一个java.lang.reflect.Proxy
。该代理服务器的AnnotationInvocationHandler
将数据值存储在LinkedHashMap
中。
所以涉及的对象更多,并且它们占用的空间比普通类更多。