2014-11-18 4 views
3

나는 차이가 그것을 후에 변경할 수 있도록 기본적으로 내가, 속성 읽기 전용을 만들고 싶어 사용은

public final type attribute_name; 

private type attribute_name; 
public type getA_name() { 
    return attribute_name; 
} 

사이에 무엇인지 궁금 해서요 초기화되었습니다.
public final으로 만들거나 private으로 설정하고 get 메소드 (set 메소드 없음)를 통해서만 액세스 할 수 있습니까?

답변

1

final 필드 반드시이 생성자가 종료되기 전에 설정되어야합니다. 일단 설정되면 참조를 수정할 수 없습니다 (값을 재 할당 할 수 없음). 강조는으로 재 할당 할 수 없습니다. 즉, 참조가 변경 될 수는 없지만 값 자체는을 변경할 수 있습니다.

이 법적 :

final List<Integer> list = new List<Integer>(); 
list.add(5); // the value of list changes, but the reference doesn't 

이되지 않습니다 :

final List<Integer> list = new List<Integer>(); 
list = new List<Integer>(); // may seem sort of redundant but the compiler won't allow it nonetheless 

에만 게터있는 private 변수를 보유하고있는 클래스에 의해 내부적으로 재 할당 할 수 있습니다 (하지만 그렇지 않은 외부에서 볼 수 있으므로 클래스를 보유하고있는 클래스 외부에서 다시 할당 할 수는 없습니다.) 또한 클래스 외부에서는 참조를 액세스 할 수 없으므로 클래스를 보유하고있는 클래스를 제외하고는 변수를 수정할 수 없습니다.

final 변수는 어디서나 재 할당 할 수 없지만 공개 인 경우 다른 클래스가 참조에 액세스하여 해당 변수가 가리키는 객체의 값을 변경할 수 있습니다.

설명한대로 초기화 후에 변수를 다시 할당하지 않으려면 finalprivate을 모두 사용하십시오. 이런 일에 대한


사용 final :

public class User { 

    private final long registrationTimeMillis; 

    public User(/* various parameters probably would be here */) { 
     registrationTimeMillis = System.currentTimeMillis(); 
    } 

    public long getRegistrationTimeMillis() { 
     return registrationTimeMillis; 
    } 
} 

우리는 사용자의 등록 시간이 변경됩니다 기대하지 않기 때문에 그것이 건설 후 변경을 허용하지 않는 의미가 있습니다. 이 같은 없음 세터와


사용 private :

public class VendingController() { 

    private int drinksStocked = 0; 
    private int drinksDispensed = 0; 

    public void dispenseDrink() { 
     drinksDispensed++; 
    } 

    public void stockDrinks(int numberOfDrinks) { 
     drinksStocked = getDrinksRemaining() + numberOfDrinks; 
     drinksDispensed = 0; 
    } 

    public int getDrinksRemaining() { 
     return drinksStocked - drinksDispensed; 
    } 
} 

우리는 drinksDispensed의 값이 dispenseDrink() 또는 stockDrinks(int numberOfDrinks)가 호출되는 경우를 제외하고는 변경하지 않습니다. 일반적으로 자바 그것은 여전히 ​​자동 판매기 그래도 리필 될 때 자신의 클래스에 의해 재 할당 할 수 있어야합니다, 그래서 우리가 final과 관련하여


public final를 사용하여해서는 안 만 상수 이루어집니다 그 상수는 인스턴스에 종속되어서는 안되기 때문에 static 키워드도 포함됩니다.

그런 다음 방법에 사용될 수 public static final

public class UnitConversions { 

    public static final double CENTIMETERS_PER_INCH = 2.54; 

} 

행운의 영업 이익과 행복 코딩 최고의

public double convertFromCentimetersToInches(double centimeters) { 
    return centimeters/UnitConversions.CENTIMETERS_PER_INCH; 
} 

을 다음과 같이 감각을 사용하기는 보낼 때의 예. 그렇지 final하지만 private이되면

More reading on final fields

+0

질문은 필드가 아니라 메서드에 대한 것입니다. – SirRichie

+0

이것은 OP의 질문 – AlexR

+0

에 대한 대답이 아닙니다. 질문은 get 메소드를 사용하여 final 또는 private로 설정하는 것보다 더 차이가 있습니다. – Don

4

는 클래스 자체는 값을 변경 할 수 있습니다.

1

마지막 수정자는 한 번만 필드를 할당 할 수 있습니다. 그 이후에는 변경할 수 없으며 개체 생성 중에 (즉 생성자가 반환하기 전에) 필드를 설정해야합니다.

필드를 읽기 전용으로 만들려면 비공개로 설정하고 필드 (또는 비 기본 유형의 경우 사본)를 반환하는 공용 getter를 제공하십시오.

실제 상수에만 public final을 사용해야합니다. 비록 당신의 필드가 final 때문에 불변이라 할지라도, 종종 private으로 만드는 것이 좋습니다.

0

올바른 방법은 미래에 생각하는 것입니다. 목표를 달성하는 데 도움이되는 것은 무엇입니까? 어쩌면 나중에 변수에 값을 부여하기를 원할 것입니다. 내가 너라면, 나는이 방법을 얻고 그 변수를 비공개로 유지함으로써 이것을 할 것이다. final 키워드에 대한

전체 문서 : http://en.wikipedia.org/wiki/Final_(Java)

0

당신이에서 액세스 할 위치에 따라 달라집니다. 공용 변수는 변수가있는 클래스에서만 private에 액세스 할 수있는 프로젝트 및 패키지 내의 모든 클래스에서 액세스 할 수 있습니다.

'최종'연산자는 영구적이며 읽기 전용으로 만듭니다.

0

type은 원시 타입이 아니라 객체에 대한 참조라고 가정합시다.

  1. public final type attribute_name

    attribute_name 다른 것을 참조하는 재 할당 할 수 없음을 의미합니다. 그러나 attribute_name을 사용하여 상태를 변경하는 메서드를 호출 할 수 있습니다.

  2. private type attribute_name에서 클래스 내의 메소드 만 attribute_name의 메소드를 호출 할 수 있습니다.

그래서 일정하게 유지하려면 접근법 (2)을 사용하십시오. public 메서드를 궁극적으로 상태를 수정하지 않는 attribute_name의 메서드를 호출하는 메서드로 제한하십시오.

1

이는 몇 가지 요인에 따라 다릅니다.

이전에 알려졌지만 결코 변경되지 않는 실제 상수 인 경우 final을 사용하십시오.Java에서 final 필드는 생성자에서 초기화 될 수 있으므로 건설 시간에 값이 알려지면 final도 사용할 수 있습니다.

런타임 중에이 값이 설정되면 (1 회, 여러 번) private + getter을 사용하십시오.

+1

을 반환하자마자 바로 앞에 나옵니다.) 중요한 것은 OP가 '비공개'와 getter 중 하나를 선택할 필요가 없지만 둘 다 사용하는 것입니다. – Mardoz