Java 使用类注释或静态属性

Java 使用类注释或静态属性,java,annotations,static-members,Java,Annotations,Static Members,我对Java相当陌生,想知道这里的最佳实践 假设我有一个通用类(例如Car),和一些继承类(Honda,Subaru),它们共享一些属性 public abstract class Car { public static short id; } public class Honda extends Car { public static final short id = 1; } public class Subaru extends Car { public static fi

我对Java相当陌生,想知道这里的最佳实践

假设我有一个通用类(例如
Car
),和一些继承类(
Honda
Subaru
),它们共享一些属性

public abstract class Car {
  public static short id;
}

public class Honda extends Car {
  public static final short id = 1;
}

public class Subaru extends Car {
  public static final short id = 2;
}
这难道不违背干涸的原则吗?那么使用注释呢

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Id {
  public short value();
}

public abstract class Car {
}

@Id(1)
public class Honda extends Car {
}

@Id(2)
public class Subaru extends Car {
}

这当然是一个品味的问题。我不会向你推荐的。 注释是标记字段、方法和类的元信息。 id(或NBSEATES)是一个字段而不是注释

我希望你的情况是这样的:

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;
    }
}
编辑:抱歉:此解决方案存在严重缺陷:-( 作为汽车,本田和斯巴鲁共享同一领域。 看看这个:

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;
    }
}
公共抽象类汽车{
受保护的抽象短id();

公共静态短getIdOf(类您的
Car
不是泛型,您的其他类也不是从中继承的。您的类已经有一个ID。它们被称为
Car
Honda
Subaru
。这些名称可以使用反射检索。您可能需要的唯一附加ID是
serialVersionUID
,但该ID是特定于cla的ss实现,因此不会打破枯燥的原则。请注意,您不能继承
静态
成员(字段和方法)。(好的,前面注释中的“您可能需要的唯一附加ID”是夸大了它)@RohitJain我忘了扩展我的示例中的类,我的问题是,@owlstead
id
只是一个示例,可能是nbSeats。此外,虽然我理解该示例应该由于继承静态成员而失败,但它似乎运行得很好。我问的是:对于我的用例,使用注释可以吗?