물론 약간의 취향이 있습니다. 나는 당신에게 그것을 추천하지 않을 것이다. 주석은 입니다. 메타 정보 ~ 기호 필드, 메소드 및 클래스입니다. 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;
}
}
편집 : 죄송합니다 :이 솔루션은 자동차, 혼다 및 스바루 SHARE 같은 분야로 깊이 결함 :-( 입니다 을.
에서
public static void main(String[] args) {
new Honda();
new Subaru();
System.out.println(Honda.getId());
System.out.println(Subaru.getId());
}
결과 : • 그래도에 보라
2
2
나는이 솔루션이 더 나은 것 같아요 :
그것은
자동차의 모든 구상 서브 클래스는 id를 가지고 시행
- (ID를 구현하여 (:
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;
}
}
그것은 몇 가지 장점을 가지고)).
- 그것은 슈퍼 클래스 자동차에 자동차의 서브 클래스를 숨 깁니다
- 컴파일러는 자동차의 서브 클래스는
- 그것은 클래스를로드하는 클래스 로더를 적용 getIdOf()에 전달되는 것을 확인할 수 있습니다 (static-initializers는 클래스가로드 될 때만 실행됩니다!방법은
- 인스턴스가 ID를 호출하는 데 필요한 비 정적 (-
- 그것은 자바 반사를
- ID를() 필요 :)
- 많은 사람들
그것은 몇 가지 단점이 있습니다 당신은 추상적 인 subclas를 전달할 수 있습니다
- )
- 는 모든 서브 클래스에 기본 공용 생성자를 요구한다 getIdOf에 SES()
- 많은 사람들
주석의 매개 변수의 종류 만 원시 타입, 문자열, 클래스, 주석, 열거 및 1 차원 배열로 제한되어 있음을 명심하십시오!
나도 당신'Car' 제네릭 않으며, 다른 클래스가 상속. –
클래스에 이미 ID가 있습니다. 그들은 '자동차', '혼다', '스바루'라고 불린다. 이 이름은 리플렉션을 사용하여 검색 할 수 있습니다. 추가로 필요한 유일한 ID는'serialVersionUID'이지만 클래스 구현에만 해당되므로 DRY 원칙을 위반하지 않습니다. –
'static '멤버 (필드와 메소드)를 상속받을 수는 없습니다. (예, 이전에 코멘트에 "추가로 필요한 유일한 ID"는 그것을 과장하는 것입니다.) –