2017-09-20 14 views
0

자바에서 불변성을 연구 할 때이 질문을 접했습니다. 클래스를 불변으로 만들려면 클래스를 final로 선언해야 메서드를 확장 할 수 없다고 말해야합니다. 나는 개인이나 메소드를 Java에서 final로 표시하면 같은 결과를 얻을 수 있다는 질문을한다. 그렇게하면 수업을 최종으로 표시 할 필요가 없습니다. 나는이 사실을 알고있다. 이것에 대한 귀하의 생각은 높이 평가됩니다.Java : private method vs final class

+0

대상 자체를 설명하는 질문 자체는 * 클래스를 변경 불가능하게 만들고 * 오버라이드되지 않도록하는 메소드를 만들지 않기 위해 *입니다. – nullpointer

+0

하위 클래스 @kltis에 새 메서드 및 필드를 추가하면 어떻게됩니까? – VedX

답변

1

public 변경 메소드 또는 필드가없는 final이 아닌 클래스를 사용하면 해당 클래스를 계속 서브 클래 싱 할 수 있다는 것입니다.

는이 불변 인 클래스 말해봐 :

class Point { 
    private int x, y; 
    // getters 

    // constructors 
} 

이 클래스는 공용 돌연변이 방법 또는 필드가 없습니다,하지만 그렇게 다른 사람들은 여전히 ​​변경할 수 있도록 그것을 하위 클래스, 최종되지 않습니다 :

class MyPoint extends Point { 
    public int foo; 
} 

이제 갑자기 원하는 값으로 foo의 값을 변경할 수 있습니다. MyPoint가 이제 바뀔 수 있습니다!

이 때문에 불변 클래스를 final로 표시해야합니다.

4

final Java 클래스는 서브 클래 싱 할 수 없습니다. 즉, 정의에 따라 메서드가 오버로드되거나 새 메서드 (동작)가 클래스에 추가되지 않습니다. 반대로, 클래스의 모든 메소드를 표시하려면 final 다른 의미가 있습니다. final 메서드를 재정의하거나 숨길 수 없습니다. 그러나 모든 메소드 final 만 표시하면 클래스가 서브 클래 싱되고 새 메소드/비헤이비어가 추가 될 수 있습니다.

1

변경할 수없는 클래스를 재정의하면 변경 가능한 데이터를 추가 할 수 있습니다. 기존 데이터의 가변성을 방지 할 수 final에 방법을 설정하는 동안

class SuddenlyMutableString extends String { 
    private int id; 
    public int getId() { return id; } 
    public void setId(int i) { id = i; } 
} 

그래서, 당신은 여전히 ​​가변 서브 클래스를 얻을 수 있습니다.