2012-05-14 2 views
0

기본 유형과 일부 파생 유형이 있습니다. 파생 된 모든 유형은 util 클래스의 static final 필드에 의해 초기화되는 필드를 가지며 기본 유형은 필드를 사용합니다. 예컨대상속 계층 구조에서 필드를 디자인하는 방법은 무엇입니까?

public BaseClass{ 
    protected String FLAG = ""; 

    public void someMethod(){ 
     // codes using FLAG 
    } 
} 

public DerivedClass1 implements BaseClass{ 
    protected String FLAG = Util.FLAG1; 
} 

public DerivedClass2 implements BaseClass{ 
    protected String FLAG = Util.FLAG2; 
} 

내 질문

  1. 디자인은 괜찮입니까?
  2. FLAG에 대해 getter/setter를 보호해야하고 파생 클래스에서 setter를 사용하여 초기화해야합니까?
  3. 다른 클래스가 FLAG을 호출하는 경우 (예 : if (baseClass.FLAG.equals(...))) 공용 getter/setter를 사용해야합니까? 나는 FLAG이 플래그 일 뿐이므로 그렇게 생각하지 않습니다. 이것은 정적 필드와 다소 비슷합니다.
+0

시도해 보셨습니까? (네 이름 때문에 정적 필드라고 생각하지 마라.모바일 안드로이드 사이트에서 댓글을 삭제 해 주시기 바랍니다.) –

답변

0

1- 아니요, 디자인이 좋지 않습니다. 당신은 서브 클래스에 플래그를 다시 정의,하지만 슈퍼 클래스에 플래그에 값을 지정해야합니다 : 그것은 하나가 아니기 때문에

public DerivedClass1 implements BaseClass{ 
    public DerivedClass1() { 
     this.flag = Util.FLAG1; 
    } 
} 

필드는 상수처럼 이름이되어서는 안된다. FLAG 대신 flag입니다.

2- 필수는 아닙니다. 그러나 기본 클래스 생성자를 인수로 만들어 모든 하위 클래스가 생성시 값을 제공하도록 할 수 있습니다.

3- 다른 클래스의 필드에 직접 액세스하지 마십시오. 확실히 외부에서 접근하기 위해 게터를 사용하십시오. 그리고 아니요, 플래그는 정적 필드가 아닙니다. 모든 인스턴스마다 고유 한 값이 있기 때문입니다.

+0

감사합니다. 그러나 세 번째 질문은 사실 'DerivedClass1'의 모든 인스턴스에는 플래그 (값이 동일 함)가 있습니다. –

+1

값은 같지만 필드를 정적으로 만들지는 않습니다. 플래그 값에 액세스하려면 DerivedClass1 인스턴스가 필요합니다. –

1

하위 클래스 필드가 기본 클래스 필드를 숨기기 때문에 디자인이 정상적이지 않습니다. 당신은 단지 각 서브 클래스에서 다른 그 기본 클래스의 필드를 지정하려면, 각각의 생성자에서 할 - 더 나은 또는 기본 클래스의 생성자에 위임 :

public BaseClass { 
    protected final String FLAG; 
    protected BaseClass(String flag) { this.FLAG = flag; } 
    ... 
} 

public DerivedClass1 extends BaseClass { 
    public DerivedClass1() { super(Util.FLAG1); } 
    ... 
} 

public DerivedClass2 extends BaseClass { 
    public DerivedClass2() { super(Util.FLAG2); } 
    ... 
} 

또한이에 위치하고 있습니다 강력한 Java 규약으로 UPPER_CASE에서 인스턴스 필드를 명명합니다. 따라서 protected String flag이 있어야합니다. 다른 두 가지 질문에 대해서는

- 당신이 flag 필드가 final 어디 있는지, 위에서 언급 한 것과 디자인을 변경하는 경우, 당신은 그것을 public을하고 다른 사람이 직접 액세스 할 수 있습니다. 그것은 내가 생각하는 한 정당한 디자인 일 것이다. 그러나 당신은 아마 그 일을 위해 많은 다른 자바 개발자로부터 눈살을 찌푸 릴 것이다.

세터을 플래그로 추가한다고 언급했는데, 어떤 감각 (추측 만, 당신은 실제로 그 깃발을 나중에 바꾸고 싶을지도 모른다).

+0

+1 좋은 답변입니다. 요점은 당신이 (다형성이라고 불리는) 방법을 오버라이드 할 수 있지만 속성은 무시할 수 없다는 것입니다. – Brady

+0

감사합니다. 그럼 다른 클래스가 호출하면'baseClass.getFlag()'를 사용해야한다. BTW, 명명 규칙 물건에 대해 알아,하지만 난 그냥 깃발은 의미에 대한 정적 필드와 같다고 생각합니다. –

+0

그것은 당신의 아이디어를 이끌어내는 잘못된 종류의 의미입니다. Java 개발자가'FLAG'를 볼 때, 직관적으로'static final' 필드라는 이유가 있습니다 - 그리고 여러분의 경우에는 잘못된 길을 인도 할 것입니다. 상위 레벨의 비즈니스 의미론은 var 명명을 구동하는 것이 아닙니다. –

0

데이터 만 다르지만 (적어도 지금까지는) 행동이 아닌 클래스가 있으므로이 디자인이 마음에 들지 않습니다. 전용 인스턴스를 생성하는 정적 팩토리 메소드를 제공하여 나쁜 MyClass 인스턴스를 생성에서

이 경우
public MyClass { 
    protected final String FLAG; 

    public static MyClass CreateClass1() { return new MyClass(Util.FLAG1); } 

    public static MyClass CreateClass2() { return new MyClass(Util.FLAG1); } 

    protected MyClass(String flag) { this.FLAG = flag; } 
} 

, 당신이 보호 한 사용자가 다음과 같이 나는 그것을 구조화 것입니다. 지금까지는 필요하지 않은 클래스 계층 구조를 만들지 않았습니다.

관련 문제