값이 할당되기 전에 (즉 생성자를 호출하지 않고) 클라이언트가 질문의 공개 입력란에 액세스 할 수 있다면 명백한 문제가있을 수 있습니다. 특히이 필드는 클라이언트가 액세스하려고 할 때 예상/적절한 값을 가질 수 없습니다. 그럼에도 불구하고 주석에서 지적한대로 을 static
식별자로 선언하지 않았기 때문에이 상수의 값을 생성자를 먼저 호출하지 않고 검색 할 수 없습니다.
따라서, 당신이하고있는 일을하는 것이 (불변의 관점에서) 현명한 것으로 보일 것입니다. 그러나 "좋은 코드"라는 측면에서 보면 (다른 사람들이 말했듯이) 자신과 고객이이 값을 명시 적으로 이름으로 참조하도록 강요합니다. 그래도 getter를 사용하고 MY_INT
이라는 이름을 변경해야 할 경우 상수의 용도를 동일하게 유지해야하므로 사용자 또는 클라이언트 모두 Test
의 구현을 넘어서는 변경을 강요 당할 수 없습니다.
좀 더 명확하게 말하면, 클래스에 게터 및 사유화 된 상수를 제공합니다.
public class Test {
private final int MY_INT;
public Test(int myInt) {
MY_INT = myInt;
}
public int getAssignedIntValue() {
return MY_INT;
}
}
나는 할당 된 정수 값과 같이 얻을 것입니다 :
Test test = new Test(1);
// with your class
test.MY_INT;
// with the above class
test.getAssignedIntValue();
을 지금, 명명 규칙에 맞게 MY_INT
myInt
에 이름을 변경 말한다. 두 경우 모두 클래스의 모든 발생을 MY_INT
으로 변경해야합니다.
// if this is the old code from above
Test test = new Test(1);
// I need to change this to test.myInt, or I get an ERROR!
test.MY_INT;
// since I didn't change the name of the getter, all is well
test.getAssignedIntValue();
참고 :이 허용 답을되었을 수도 있지만, 반드시 가장 적합한 추론이없는 나는 새로운 상수 이름 값을 얻을 필요하지만, 두 구현의 차이는 분명해진다 . 보다 일반적인 맥락에서 주어진 이유에 대해서는 this answer을 참조하십시오.
당신은 getter/setters가 없으므로 기본적으로 불변의 객체를 생성합니다. 이것은 좋은 것입니다. –
@pbabcdefp 최종적입니다 –
죄송합니다. 일시적인 뇌의 동결. –