2010-02-24 2 views
42

"최종 최종 필드 객체가 초기화되지 않았을 수 있습니다"라는 컴파일러가 경고하므로 아래 코드가 의미가 있는지 궁금합니다. 이 작업을 수행하는 더 좋은 방법이 있습니까?최종 초기화되지 않은 필드가있는 추상 클래스

public abstract Test { 
    protected final ArrayList<Object> objects; 
} 

public TestSubA extends Test { 

    public TestSubA() { 
    objects = new ArrayList<Objects>(20); 
    // Other stuff 
    } 
} 

public TestSubB extends Test { 

    public TestSubB() { 
    objects = new ArrayList<Objects>(100); 
    // Other stuff 
    } 
} 
내가 마지막 현장을 확인하고 최대 값을 전달하기 위해 생성자를 강제
+5

+1 : 올바른 작업을 수행하기 위해 관심이 있습니다. – helios

답변

41

:

public abstract class Test { 
    private final ArrayList<Object> objects; 

    protected ArrayList<Object> getObjects() { 
    return objects; 
    } 

    protected Test(ArrayList<Object> objects) { 
    this.objects = objects; 
    } 
} 

public class TestSubA extends Test { 

    public TestSubA() { 
    super(new ArrayList<Object>(20)); 
    // Other stuff 
    } 
} 

public class TestSubB extends Test { 

    public TestSubB() { 
    super(new ArrayList<Object>(100)); 
    // Other stuff 
    } 
} 
+0

+1 나에게 이길 테니, 똑같은 대답이 있었는데, 사소한 차이가있었습니다 (즉, int 매개 변수를 사용하고 this() 대신 super()를 호출). – MCory

+0

감사합니다. 왜 당신이 그것을 보호하지 않고 비공개로 만든 특별한 이유가 있습니까? 하위 클래스에서 직접 액세스하려고한다고 가정합니다. 왜 super() 대신 this()를 사용합니까? – Cantillon

+0

@MCory @Lieven 나는 처음부터 모든 것을 올바르게하는 것이 쉽지 않은 스마트 폰의 빠른 답변이라고 생각합니다. –

0

는 일반적으로, 항상 필드를 설정하는 기본 클래스의 생성자가 더 좋을 수도 있습니다 , 그것을 설정하지 않는 기본 생성자가 없습니다. 그런 다음 서브 클래스는 super (value)를 사용하여 생성자의 첫 번째 행에 명시 적으로 매개 변수를 전달할 수 있습니다.

+0

Ooops, 미안. 복사/붙여 넣기 오류입니다. 내 코드를 편집했습니다. – Cantillon

2

추상 클래스 생성자에서 객체를 인스턴스화하고 그 생성자에 차이를 전달하기 만하면됩니다.

5

하위 클래스의 생성자에서 직접 최종 매개 변수를 초기화 할 때 문제는 super()가 생성자의 첫 번째 문이어야하므로 하위 클래스의 모든 항목을 한 줄로 처리해야한다는 것입니다. 따라서 대신 생성자를 비공개로 만들고 다음과 같은 정적 빌드 메서드를 만드는 것이 더 좋습니다.

public abstract class Test { 
    protected final ArrayList<Object> objects; 

    protected Test(ArrayList<Object> objects) { 
    this.objects = objects; 
    } 
} 

public class TestSubA extends Test { 
    public static TestSubA build() { 
    ArrayList<Object> objects = new ArrayList<Object>(20); 
    objects.put(...); 
    // Other stuff 
    return new TestSubA(objects); 
    } 

    private TestSubA(ArrayList<Object> objects) { 
    super(objects); 
    } 
} 
관련 문제