item 90 SeungminLee - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
item 90
μ§λ ¬νλ μΈμ€ν΄μ€ λμ μ§λ ¬ν νλ‘μ μ¬μ©μ κ²ν νλΌ
Serializableμ ꡬννκΈ°λ‘ κ²°μ ν μκ° μΈμ΄μ μ μ λ©μ»€λμ¦μΈ μμ±μ μ΄μΈμ λ°©λ²μΌλ‘ μΈμ€ν΄μ€λ₯Ό μμ±ν μ μκ² λλ€. λ²κ·Έμ 보μ λ¬Έμ κ° μΌμ΄λ κ°λ₯μ±μ΄ 컀μ§λ€λ λ»μ΄λ€. νμ§λ§ μ΄ μνμ ν¬κ² μ€μ¬μ€ κΈ°λ²μ΄ νλ μλ€. λ°λ‘ μ§λ ¬ν νλ‘μ ν¨ν΄μ΄λ€.
μ§λ ¬ν νλ‘μ ν¨ν΄
- λ°κΉ₯ ν΄λμ€μ λ Όλ¦¬μ μνλ₯Ό μ λ°νκ² νννλ μ€μ²© ν΄λμ€λ₯Ό μ€κ³ν΄ private static μΌλ‘ μ μΈνλ€. β μ΄ μ€μ²© ν΄λμ€κ° λ°λ‘ λ°κΉ₯ ν΄λμ€μ μ§λ ¬ν νλ‘μλ€.
- μ€μ²© ν΄λμ€μ μμ±μλ λ¨ νλμ¬μΌ νλ©°, λ°κΉ₯ ν΄λμ€λ₯Ό 맀κ°λ³μλ‘ λ°μμΌ νλ€. β μ΄ μμ±μλ λ¨μν μΈμλ‘ λμ΄μ¨ μΈμ€ν΄μ€μ λ°μ΄ν°λ₯Ό 볡μ¬νλ€.
- μΌκ΄μ± κ²μ¬λ λ°©μ΄μ 볡μ¬κ° νμ μμΌλ©° μ€κ³μ, μ§λ ¬ν νλ‘μμ κΈ°λ³Έ μ§λ ¬ν ννλ λ°κΉ₯ ν΄λμ€μ μ§λ ¬ν ννλ‘ μ°κΈ°μ μ΄μμ μ΄λ€. (?)
- λ°κΉ₯ ν΄λμ€μ μ§λ ¬ν νλ‘μ λͺ¨λ Serializableμ ꡬννλ€κ³ μ μΈν΄μΌ νλ€.
Period ν΄λμ€λ₯Ό μ΄μ©ν΄ μ§λ ¬ν νλ‘μ ν¨ν΄μ ꡬνν΄λ³΄μ.
- Period ν΄λμ€λ₯Ό μν μ§λ ¬ν νλ‘μ class SerializationProxy
private static class SerializationProxy implements Serializable {
private final Date start;
private final Date end;
SerializationProxy(Period p) {
this.start = p.start;
this.end = p.end;
}
private static final long serialVersionID = 24398393023209203L; // μ무 μ«μλ λ€ λλ€
}
- μ§λ ¬ν νλ‘μλ₯Ό μ¬μ©νλ λͺ¨λ ν΄λμ€μ λ²μ©μ μΌλ‘ μ¨μ€μΌ νλ λ©μλ writeReplaceλ₯Ό λ°κΉ₯ ν΄λμ€μ μΆκ°
private Object writeReplace() {
return new SerializationProxy(this);
}
β writeReplaceλ μλ°μ μ§λ ¬ν μμ€ν μ΄ λ°κΉ₯ ν΄λμ€μ μΈμ€ν΄μ€ λμ SerializationProxyμ μΈμ€ν΄μ€λ₯Ό λ°ννκ² νλ μν μ νλ€. (μ§λ ¬νκ° μ΄λ€μ§κΈ° μ μ λ°κΉ₯ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό μ§λ ¬ν νλ‘μλ‘ λ³νν΄μ€λ€) β μ΄ λ©μλ λλΆμ μ§λ ¬ν μμ€ν μ κ²°μ½ λ°κΉ₯ ν΄λμ€μ μ§λ ¬νλ μΈμ€ν΄μ€λ₯Ό μμ±ν΄λΌ μ μμ§λ§ λΆλ³μμ νΌμνκ³ λ°κΉ₯ ν΄λμ€μ μ§λ ¬νλ μΈμ€ν΄μ€λ₯Ό μμ±νκ³ μ νλ μλμλ μ΄λ»κ² ν΄μΌ νλκ°?
- λΆλ³μμ νΌμνκ³ μ νλ μλλ₯Ό λ§κΈ° μν΄ λ©μλ readObjectλ₯Ό λ°κΉ₯ ν΄λμ€μ μΆκ°
private void readObject(ObjectInputStream stream) {
throws InvalidObjectException {
throw new InvalidObjectException("νλ‘μκ° νμν©λλ€.");
}
- λ§μ§λ§μΌλ‘, λ°κΉ₯ ν΄λμ€μ λ Όλ¦¬μ μΌλ‘ λμΌν μΈμ€ν΄μ€λ₯Ό λ°ννλ λ©μλ readResolveλ₯Ό μΆκ°νλ€. β μ΄ λ©μλλ μμ§λ ¬ν μμ μ§λ ¬ν μμ€ν μ΄ μ§λ ¬ν νλ‘μλ₯Ό λ€μ λ°κΉ₯ ν΄λμ€μ μΈμ€ν΄μ€λ‘ λ³ννκ² ν΄μ€λ€. β 곡κ°λ APIλ§μ μ¬μ©ν΄ λ°κΉ₯ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό μμ±νλ€. β μ§λ ¬νλ μμ±μλ₯Ό μ΄μ©νμ§ μκ³ λ μΈμ€ν΄μ€λ₯Ό μμ±νλ κΈ°λ₯μ μ 곡νλλ°, μ΄ ν¨λ‘μ μ§λ ¬νμ μ΄λ° κ·μΉμ μ΄κΈλ νΉμ±μ μλΉ λΆλΆ μ κ±°νλ€. βμ¦, μΌλ° μΈμ€ν΄μ€λ₯Ό λ§λ€ λμ λκ°μ μμ±μ, μ μ ν©ν°λ¦¬, νΉμ λ€λ₯Έ λ©μλλ₯Ό μ¬μ©ν΄μ μμ§λ ¬νλ μΈμ€ν΄μ€ λ₯Ό μμ±νλ€.
"μμ§λ ¬νλ μΈμ€ν΄μ€κ° ν΄λΉ ν΄λμ€μ λΆλ³μμ λ§μ‘±νλμ§ κ²μ¬ν λ λ€λ₯Έ μλ¨μ κ°κ΅¬νμ§ μμλ λλ€. κ·Έ ν΄λμ€μ μ μ ν©ν°λ¦¬λ μμ±μκ° λΆλ³μμ νμΈν΄μ£Όκ³ μΈμ€ν΄μ€ λ©μλλ€μ΄ λΆλ³μμ μ μ§μΌμ€λ€λ©΄, λ ν΄μ€μΌ ν μΌμ μλ€."
private Object readResolve() {
return new Period(start, end);
}
λ°©μ΄μ 볡μ¬μ²λΌ, μ§λ ¬ν νλ‘μ ν¨ν΄μ κ°μ§ λ°μ΄νΈ μ€νΈλ¦Ό 곡격과 λ΄λΆ νλ νμ·¨ 곡격μ νλ‘μ μμ€μμ μ°¨λ¨ν΄μ€λ€. λν μ§λ ¬ν νλ‘μλ μμμ Period νλλ₯Ό finalλ‘ μ μΈν΄λ λλ―λ‘ Period ν΄λμ€λ₯Ό μ§μ ν λΆλ³μΌλ‘ λ§λ€ μλ μλ€.
"νλ‘μ ν¨ν΄μ μ¬μ©νλ©΄ μ΄λ¦¬μ 리 κ³ λ―Όν νμκ° κ±°μ μλ€! μ΄λ€ νλκ° κΈ°λ§μ μΈ μ§λ ¬ν 곡격μ λͺ©νκ° λ μ§ κ³ λ―Όνμ§ μμλ λλ©°, μμ§λ ¬ν λ μ ν¨μ± κ²μ¬λ₯Ό μννμ§ μμλ λλ€."
μ§λ ¬ν νλ‘μ ν¨ν΄μ μμ§λ ¬νν μΈμ€ν΄μ€μ μλμ μ§λ ¬νλ μΈμ€ν΄μ€μ ν΄λμ€κ° λ¬λΌλ μ μ μλνλ€.
μ΄κ² λ¬΄μ¨ μ©λμΌκΉ?
EnumSetμ public μμ±μ μμ΄ μ μ ν©ν°λ¦¬λ€λ§ μ 곡νλ€. ν΄λΌμ΄μΈνΈμ μ μ₯μμλ λκ°μ§λ§ OpenJDKλ₯Ό 보면 μ΄κ±° νμ μ μμκ° 64κ°Έ μ΄νλ©΄ RegularEnumSetμ μ¬μ©νκ³ , κ·Έλ³΄λ€ ν¬λ©΄ JumboEnumSetλ₯Ό μ¬μ©νλ€.
- μμκ° 64κ°μ§λ¦¬ μ΄κ±° νμ μ κ°μ§ EnumSetμ μ§λ ¬ν νλ€.
- μμ 5κ°λ₯Ό μΆκ°νκ³ (μμκ° 64κ° μ΄μμ΄ λ¨) μμ§λ ¬νλ₯Ό ν΄λ³΄μ.
- μ²λ¦ μ§λ ¬ν λ κ²μ RegularEnumSetμ΄μ§λ§, μμ§λ ¬νλ 64κ° μ΄μμΈ JumboEnumSet μΈμ€ν΄μ€λ‘ νλ©΄ μ’μ κ²μ΄λ€.
- μ΄λ μ€μ λ‘ EnumSet μ§λ ¬νμ μ¬μ©λκ³ μλ ν¨ν΄μ΄λ€.
private static class SerializationProxy <E extends Enum<E>> implements Serializable {
// EnumSet μμ νμ
private final Class<E> elementType;
// EnumSet μμ μμλ€
private final Enum<?>[] elements;
SerializationProxy(EnumSet<E> set) {
elementType = set.elementType;
elements = set.toArray(new Enum<?>[0]);
}
private Object readResolve() {
EnumSet<E> result = EnumSet.noneOf(elementType);
for (Enum<?> e : elements)
result.add((E)e);
return result;
}
private static final long serialVersionID = 928891839302L;
}
νλ‘μ ν¨ν΄μ νκ³
- ν΄λΌμ΄μΈνΈκ° λ©λλ‘ νμ₯ν μ μλ ν΄λμ€μλ μ μ©ν μ μλ€.
- κ°μ²΄ κ·Έλνμ μνμ΄ μλ ν΄λμ€μλ μ μ©ν μ μλ€. (μ§λ ¬ν νλ‘μλ§ κ°μ‘μ§ μμ§ κ°μ²΄κ° λ§λ€μ΄μ§μ§ μμμ readReolve μμμ νΈμΆνλ©΄ ClassCastExceptionμ΄ λ°μνλ€)
- μ§λ ¬ν νλ‘μ ν¨ν΄μ μμ£Ό κ°λ ₯ν μμ μ±μ μ 곡νμ§λ§ λ°©μ΄μ λ³΅μ¬ λλ³΄λ€ μλκ° λ리λ€. (νκ²½μ λ°λΌ μΌλ§λ λλ¦°μ§λ λ€λ¦)
ν΅μ¬μ 리
μ 3μκ° νμ₯ν μ μλ ν΄λμ€λΌλ©΄ κ°λ₯ν ν μ§λ ¬ν νλ‘μ ν¨ν΄μ μ¬μ©νμ. μ΄ ν¨ν΄μ΄ μλ§λ μ€μν λΆλ³μμ μμ μ μΌλ‘ μ§λ ¬νν΄μ£Όλ κ°μ₯ μ¬μ΄ λ°©λ²μΌ κ²μ΄λ€.