2009-06-19 2 views
1

Java String 클래스처럼 불변 클래스를 만드는 데 효율적인 방법을 찾고 있습니다.가능한 개체를 만들 수있는 가능한 방법

+0

String과 같은 클래스를 찾고 계십니까? 처음에는 그런 식으로 질문을 읽지 않았지만, 그렇다면 일부 String 관련 예제로 내 대답을 바꿀 것입니다. – Jorn

+0

문자열은 Java의 특수한 시민입니다. 정확히 기본 유형은 아니지만 클래스로 간주 할 수도 없습니다. String은 + 연산자를 오버로드하는 유일한 클래스입니다. 두 개의 문자열을 추가하면 새로운 문자열이 생깁니다. 정규 클래스에서는 연산자 오버로딩을 허용하지 않습니다. – kgiannakakis

+0

문자열을 클래스로 간주 할 수 없다 ??? –

답변

8
  1. 모든 필드는 클래스가 가 재정의 할 수 없습니다 확인 private 바람직 final
  2. 을해야합니다 생성자/팩토리
  3. 필드에 대한 설정자를 제공하지 마십시오.
  4. 컬렉션에주의하십시오. Collections.unmodifiable*을 사용하십시오. 또한, 컬렉션은 불변 객체
  5. 모든 게터가 불변의 객체를 제공하거나 defensive copying
  6. 이 객체의 내부 상태를 변경 있는 방법을 제공하지 마십시오 사용해야합니다 포함되어야합니다.

Tom Hawtinfinal이 선택적 일 수 있다고 지적했다. Stringclass에는 해시 함수가 호출 될 때만 할당되는 캐시 hash var가 있습니다.

+0

썬 문자열 구현에 최종 필드가 아닌 인스턴스 필드가 있습니다. –

+0

좋은 지적. '최종'은 요구 사항이 아닙니다. String의 hash 변수는 완벽한 예입니다. –

+0

파생 클래스가 보호 된 필드를 노출하지 않도록 클래스를 final로 만드는 것에 대해서도 고려해야합니다. –

1

필드를 수정할 수없는 경우 개체가 변경되지 않으므로 해당 필드는 final이어야합니다. 객체를 서브 클래스 화하지 않으려면 String 자체와 마찬가지로 클래스 자체를 final으로 만들 수 있습니다. 쉽게 생성자를 사용하여 모든 필드를 채우는 경우 Wikipedia

+0

그리고 하위 클래스가 필요 없다면 클래스 자체를 최종적으로 만들어야합니다. –

+0

좋은 지적, 나는 그것을 추가 할 것이다. – Jorn

1

를 참조하면 자세한 내용 Factory Pattern

보라, 많은 정보와 불변의 객체를 생성하고 필드 최종하려면 - 당신은 도중에있다 그곳에.

필드가 사용자 정의 유형을 사용하는 경우이를 변경할 수 없게해야 할 수도 있습니다.

컬렉션 인 모든 필드는 수정 불가능한 컬렉션을 사용해야하며 안전한쪽에 있어야합니다.

개체 그래프에 대해 걱정할 필요가 있습니다!

개체의 모든 메서드는 최종 필드가 아닌 경우 처리해야합니다. 예 : String.add는 문자열을 만듭니다. 한 필드를 변경해야하는 경우 복사 생성자를 통해 변경하십시오.

마지막으로 개체를 최종화하십시오. 클래스 최종 를하거나 정적 공장을 사용하고 민간에서 채워야합니다

  • 필드를 생성자를 유지 -

  • +0

    예를 들어 설명해 주시면 감사하겠습니다. –

    +0

    아직 사본이 없다면 Josh Bloch의 Effective Java 사본을 얻으십시오. 그는 내가 할 수있는 것보다 훨씬 더 잘 설명한다! – Fortyrunner

    +0

    분명히, 오늘 그 자체로 그것을 할 것입니다. 감사합니다 –

    관련 문제