마지막 필드가 Java로 변경되지 않는 불변 객체에 대해 자주 읽습니다. 실제로 사실입니까? 아니면 대중의 변화가없고 실제로 주를 돌연변이시키는 것만으로 충분합니까?필드가 "적절한"불변 개체를 갖기 위해 명시 적으로 최종적으로 필요합니까?
예를 들어 빌더 패턴으로 작성된 불변 오브젝트가있는 경우 빌더가 빌드 할 때 개별 필드를 지정하게하거나 빌더가 필드 자체를 보유하고 궁극적으로 변경 불가능한 오브젝트를 리턴하도록 할 수 있습니다 값을 (private) 생성자에 전달합니다.
마지막 필드를 사용하면 구현 오류를 방지 할 수 있다는 분명한 이점이 있습니다 (예 : 코드에 빌더에 대한 참조를 유지하고 기존 객체를 실제로 변경하는 동안 객체를 여러 번 "빌드"할 수 있음).하지만 빌더 저장소 객체 내부의 데이터는 DRYer로 작성됩니다.
그래서 질문 : 작성기가 개체를 조기에 누설하지 않고 빌드 된 개체를 수정하지 못한다고 가정하면 (예 : 개체 참조가 null로 설정 됨) 실제로 확보 된 것 (예 : 향상된 스레드 안전성) 개체의 필드가 최종 대신 만들어지면 개체의 "불변성"에서?
실수가 아닌 경우 * 불량 프로그래머가 리플렉션을 사용하여 클래스 필드에 액세스하고 콘텐츠를 수정하는 "반사 공격"을 막을 수 있습니다. 유명한 예제가 * String * 클래스를 완전히 왜곡하고 많은 경우에 * String *이 실제로 수정 될 수 있음을 보여줍니다 (비 finality btw로 인한 것이 아니라 일단 기본 * char [] * 당신이 배열의 내용에 불변성을 강요 할 수 없기 때문에 "게임 오버"였다면 액세스되었습니다 ...하지만 그건 내 요점이 아닙니다 : 요점은 반사가 정말로 더러운 일을하는 데 도움이된다는 것입니다. – TacticalCoder
@user, 그런 반사에 직면하여, 당신은 불변성을 확립 할 수 없습니다. 그러나 보안 관리자는 실행 가능한 타사 코드를 실행하려고합니다. – Yishai
wait ... * final * 클래스에 고유 * final int *가있는 경우 리플렉션을 사용하여 수정할 수 있습니까? 내 요점은 정확하게 * final *을 사용하지 않고서는 * 리플렉션 공격을 막을 수는 없다는 것입니다. (Security Manager를 설치하지 않는 한, 거의 불가능합니다. 그래서 많은 경우에 수정 될 "* ...). 그러나 당신이 반사를 사용하여 * final int *를 수정할 수 있는지 확신하지 못합니다. 그렇다면 다음과 같이 내 의견이 질문과 관련이 있습니다 :) (나는 어제 당신의 질문에 +1했습니다 :) – TacticalCoder