) 및 , 그것은 final
으로 표시됩니다) 내가 생각할 수있는 가장 가까운 해결책은 불변 인 래퍼 클래스를 만드는 것입니다. 이것은 완벽한 해결책이 아니며 단점이 있습니다.
첫째, 어떻게 그것을 할 :
final class ImmutableExample {
// Redeclare every field as in the Example class
// but make sure they can't be reassigned
// (in this case I'll declare them as final)
private final int i;
private final String s;
private final Object o;
ImmutableExample(Example mutableExample) {
// copy fields from original
this.i = mutableExample.getI();
this.s = mutableExample.getS();
this.o = mutableExample.getO();
}
// add getters but definitely no setters
}
을 그런 다음 같은 코드가 사방 :
Example e = new Example();
e.setI(42); // etc
변경하려면 다음
Example e = new Example();
e.setI(42); // etc
ImmutableExample immutableE = new ImmutableExample(e);
을 그리고 immutableE
에 대한 참조를 주위에 전달 e
참조가 이탈하지 않는지 확인하십시오.단점에 대한 지금
: 당신은 변경 가능한 유형을 예상하는 방법에 불변의 유형을 통과 할 수 있도록
ImmutableExample
는 Example
의 인스턴스가 아닌, 그리고 if (immutableE instanceof Example)
또는 (Example)immutableE
같은 작업은 작동하지 않습니다 이전과 같이
Example
의 모든 필드도 변경 불가능하거나 ImmutableExample
도 변경할 수 있어야합니다. 예를 들어 Object
필드가 HashMap
또는 Date
과 같이 변경 가능한 항목 일 수 있습니다.
Example
클래스가 변경되면 ImmutableExample
에서 변경을 반복해야합니다.
Example
하위 클래스 수 있었다 경우, 또는이 인터페이스 인 경우,이 방법이 더 유용 할 수도 있지만,
Example
는 서브 클래스 할 수없는 경우 나 다른 방법을 볼 수 없습니다.
현재 확장 할 수 없으며 멤버 변수를 변경할 수 없습니다 (중첩 된 클래스가 아니고 변수를 변경하는 다른 코드를 표시하지 않는 경우). –
물론, 매우 까다로운 관점에서 볼 때 리플렉션의 사용으로 인해 Java에서 불변성을 실제로 가질 수는 없지만, 그렇다고해서 이것이 당신이 얻을 수있는 불변과 거의 같습니다. – Gavin
@Gavin 클래스는 필드에 값이 없으므로 액세스 할 수 없기 때문에 변경할 수 없습니다. –