我想做这样的事情:
public class Foobar {
@Tag final private int foo;
@Tag final private int bar;
@Tag final private int baz;
@Tag final private int quux;
static private final TagValidator validator =
TagValidator.autoGenerate(Foobar.class);
public Foobar(Something something)
{
validator.validate(something);
this.foo = something.method1();
this.bar = something.anotherMethod();
this.baz = something.someOtherMethod();
this.quux = something.yetAnotherMethod();
}
... other methods ...
}
其中TagValidator.autoGenerate()
使用反射+注释解析来获取我的Foobar类的所有成员,这些成员已被@Tag
标记并做了一些蹩脚的乏味无聊的东西,我将需要做的几节课。
我的问题是,它是否会按照声明的顺序看到这些成员?我同意这样做会更安全:
public class Foobar {
@Tag(0) final private int foo;
@Tag(1) final private int bar;
@Tag(2) final private int baz;
@Tag(3) final private int quux;
...
}
但我感到很懒: - )
此外,是否可以使用同名的类和注释?
答案 0 :(得分:2)
在Class.getDeclaredFields()
和Class.getFields()
返回的数组中的元素是 没有排序,也没有 特别的顺序。
从可维护性角度来看,如果订单很重要,请将其包含在您的注释中,或者更好地依赖订单。
是的,类和注释可以具有相同的名称,只要它们位于不同的包中即可。基本上相同的规则适用于类和接口。
答案 1 :(得分:1)
假设您的TagValidator使用Class.getFields,那么javadoc说:
返回包含Field的数组 反映所有可访问的对象 公共领域或 此类表示的接口 宾语。数组中的元素 返回没有排序,不在 任何特定的订单。
所以我不会依赖它。但在实践中,这似乎总是以声明顺序返回。
答案 2 :(得分:0)
我很确定他们确实保留了声明的顺序。我这样说是因为我看到其他项目使用完全相同的技术:http://preon.flotsam.nl/ Preon将java字段绑定到二进制布局,它取决于字段声明的顺序。