用注解代替对象?

问题描述 投票:0回答:1

最近我尝试以使用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 annotations
1个回答
0
投票

与具有普通字段的自定义类相比,注释将占用更多的内存。这是因为注释是一个接口,并且Java将为每个具有RUNTIME保留的注释实例生成一个java.lang.reflect.Proxy。该代理服务器的AnnotationInvocationHandler将数据值存储在LinkedHashMap中。

所以涉及的对象更多,并且它们占用的空间比普通类更多。

© www.soinside.com 2019 - 2024. All rights reserved.