2013-07-23 2 views
1

저는 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; 
} 

DRY 원리가 깨지지 않습니까? 그러면 주석을 사용하는 것은 어떻습니까?

@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 { 
} 
+4

나도 당신'Car' 제네릭 않으며, 다른 클래스가 상속. –

+0

클래스에 이미 ID가 있습니다. 그들은 '자동차', '혼다', '스바루'라고 불린다. 이 이름은 리플렉션을 사용하여 검색 할 수 있습니다. 추가로 필요한 유일한 ID는'serialVersionUID'이지만 클래스 구현에만 해당되므로 DRY 원칙을 위반하지 않습니다. –

+0

'static '멤버 (필드와 메소드)를 상속받을 수는 없습니다. (예, 이전에 코멘트에 "추가로 필요한 유일한 ID"는 그것을 과장하는 것입니다.) –

답변

0

물론 약간의 취향이 있습니다. 나는 당신에게 그것을 추천하지 않을 것이다. 주석은 입니다. 메타 정보 ~ 기호 필드, 메소드 및 클래스입니다. 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 차원 배열로 제한되어 있음을 명심하십시오!