这当然是一个品味问题。我不会向你推荐那个。注释是标记字段、方法和类的元信息。id(或 nbSeats)是一个字段而不是注释。
在你的情况下,我更喜欢这个:
public abstract class Car {
protected static short id;
public static short getId() {
return id;
}
}
class Honda extends Car {
static {
id = 1;
}
}
class Subaru extends Car {
static {
id = 2;
}
}
编辑:对不起:这个解决方案存在严重缺陷:-(因为Car,Honda和Subaru SHARE 相同的领域。看看:
public static void main(String[] args) {
new Honda();
new Subaru();
System.out.println(Honda.getId());
System.out.println(Subaru.getId());
}
结果是
2
2
我认为这个解决方案可能会更好:
public abstract class Car {
protected abstract short id();
public static short getIdOf(Class<? extends Car> carClass)
throws InstantiationException, IllegalAccessException {
return carClass.newInstance().id();
}
public static void main(String[] args) throws InstantiationException,
IllegalAccessException {
System.out.println(Car.getIdOf(Honda.class));
System.out.println(Car.getIdOf(Subaru.class));
}
}
class Honda extends Car {
protected short id() {
return 1;
}
}
class Subaru extends Car {
protected short id() {
return 2;
}
}
它有一些优点:
- 它强制Car的每个具体子类都有一个 id(通过实现 id())。
- 它将 Car 的子类隐藏到超类Car
- 编译器可以检查只有Car的子类被传递给 getIdOf()
- 它强制类加载器加载类(静态初始化器仅在加载类时执行!)
- 好多其它的
它有一些缺点:
- 它需要java反射
- id() 方法是非静态的
- 调用 id() 需要实例
- 它要求所有子类中都有一个默认的公共构造函数
- 您可以将抽象子类传递给 getIdOf()
- 好多其它的
请记住,注解的参数类型仅限于原始类型、字符串、类、注解、枚举和一维数组!