Item 90. Serialization Proxy Pattern
μ§λ ¬νλ μΈμ€ν΄μ€ λμ μ§λ ¬ν νλ‘μ μ¬μ©μ κ²ν νλΌ
Serializable
μΈν°νμ΄μ€λ₯Ό ꡬννλ μκ° μ μμ μΈ μμ±μ μ΄μΈμ λ°©λ²μΌλ‘ μΈμ€ν΄μ€λ₯Ό μμ±ν μ μκ² λλ©΄μ, λ²κ·Έλ 보μ λ¬Έμ μ λ
ΈμΆλκ² λλ€.
μ΄λ° μνμ ν¬κ² μ€μ¬μ£Όλ κΈ°λ²μΌλ‘ μ§λ ¬ν νλ‘μ ν¨ν΄μ΄ μλ€.
ꡬν λ°©λ²
μ§λ ¬ν νλ‘μ ν¨ν΄μ ꡬν λ°©λ²μ λ€μκ³Ό κ°λ€.
λ°κΉ₯ ν΄λμ€μ λ Όλ¦¬μ μνλ₯Ό νννλ μ€μ²© ν΄λμ€λ₯Ό μ€κ³ν΄
private static
μΌλ‘ μ μΈμ€μ²© ν΄λμ€μ μμ±μλ λ¨ νλλ‘ μ ννλ©°, λ°κΉ₯ ν΄λμ€λ₯Ό λ§€κ°λ³μλ‘ λ°μ λ¨μν λμ΄μ¨ μΈμ€ν΄μ€ λ°μ΄ν°λ₯Ό 볡μ¬
λ°κΉ₯ ν΄λμ€μ μ§λ ¬ν νλ‘μ λͺ¨λ
Serializable
μ ꡬν
class Period implements Serializable {
// final ν€μλ μ¬μ©
private final Date start;
private final Date end;
public Period(Date start, Date end) {
this.start = start;
this.end = end;
}
// μ§λ ¬νν κ°μ²΄λ₯Ό λ체ν λ€λ₯Έ κ°μ²΄λ₯Ό λ°ννλ λ©μλ
private Object writeReplace() {
return new SerializationProxy(this);
}
// μμ§λ ¬ν κ³Όμ μμ νΈμΆ
private void readObject(ObjectInputStream stream) throws InvalidObjectException {
throw new InvalidObjectException("Proxy required");
}
private static class SerializationProxy implements Serializable {
private static final long serialVersionUID = 234098243823485285L; // μ무 κ°μ΄λ μκ΄ μμ
private final Date start;
private final Date end;
SerializationProxy(Period p) {
this.start = p.start;
this.end = p.end;
}
// μμ§λ ¬νλ κ°μ²΄λ₯Ό λμ ν κ°μ²΄λ₯Ό λ°ννλ μν μ μννλ λ©μλ
private Object readResolve() {
return new Period(start, end);
}
}
μμ²λΌ ꡬνλ κ°κ°μ λ©μλλ€μ μλμ κ°μ μν μ μννλ©΄μ 보μ λ¬Έμ λ₯Ό ν΄κ²°νκ² λλ€.
writeReplace
: λ°κΉ₯ ν΄λμ€ μΈμ€ν΄μ€ λμ μ§λ ¬ν νλ‘μ κ°μ²΄λ₯Ό λ°ννμ¬ μ§λ ¬ν μ€μ μμ±μ νΈμΆμ λ§μreadObject
: μμ§λ ¬νκ° μ§μ μ μΌλ‘ μ΄λ£¨μ΄μ§μ§ μλλ‘ μμΈλ₯Ό λμ Έ νλ‘μ κ°μ²΄λ₯Ό ν΅ν΄μλ§ μμ§λ ¬νκ° μ΄λ£¨μ΄μ§λλ‘ ν¨readResolve
: μμ§λ ¬νλ νλ‘μ κ°μ²΄λ₯Ό λ°κΉ₯ ν΄λμ€ μΈμ€ν΄μ€λ‘ λ체νμ¬ λ°ν
μ₯μ
μ§λ ¬ν νλ‘μ ν¨ν΄μ μ¬μ©νλ©΄ μλμ κ°μ μ₯μ μ μ»μ μ μλ€.
μ§μ ν λΆλ³ ν΄λμ€: λ©€λ² νλ final μ μΈνμ¬ λΆλ³μ± 보μ₯ κ°λ₯
μμ§λ ¬ν μ ν¨μ± κ²μ¬ λΆνμ: μ§λ ¬ν λμμ΄ μ§μ μ μΌλ‘ λμ§ μκΈ° λλ¬Έμ μμ§λ ¬ν κ³Όμ μμ μ ν¨μ± κ²μ¬λ₯Ό ν νμκ° μμ
μμ§λ ¬ν μΈμ€ν΄μ€ != μλμ μΈμ€ν΄μ€: μμ§λ ¬νλ μΈμ€ν΄μ€κ° μλμ μΈμ€ν΄μ€μ λ€λ₯΄κ² λμ΄λ λ¬Έμ κ° μμ
μ΄ μ€ 3λ²μ λν μ₯μ μ EnumSet
ν΄λμ€λ₯Ό μ¬μ©ν μμλ₯Ό ν΅ν΄ νμΈν μ μλ€.
EnumSet ν΄λμ€μ μ§λ ¬ν νλ‘μ ν¨ν΄
EnumSet
ν΄λμ€ μμ± μ RegularEnumSet
κ³Ό JumboEnumSet
λ κ°μ§ μΈμ€ν΄μ€λ₯Ό λ°ννκ² λλλ°, μ΄ λ μΈμ€ν΄μ€μ μ°¨μ΄λ λ€μκ³Ό κ°λ€.
RegularEnumSet
μΈμ€ν΄μ€: 64κ° μ΄νμ μμλ₯Ό κ°μ§ λ μ¬μ©JumboEnumSet
μΈμ€ν΄μ€: 64κ° μ΄μμ μμλ₯Ό κ°μ§ λ μ¬μ©
64κ°μ§λ¦¬ μ΄κ±° νμ
μ κ°μ§ RegularEnumSet
μΈμ€ν΄μ€λ₯Ό μ§λ ¬ννκ³ μμλ₯Ό μΆκ°ν ν μμ§λ ¬ννλ©΄ JumboEnumSet
μΈμ€ν΄μ€κ° μμ±λμ΄μΌ νλλ°,
μ΄λ₯Ό μν΄ EnumSet
ν΄λμ€λ μ§λ ¬ν νλ‘μ ν¨ν΄μ μ¬μ©ν΄ μ μ ν μΈμ€ν΄μ€λ₯Ό μμ±νλλ‘ κ΅¬νλμ΄ μλ€.
public abstract class EnumSet<E extends Enum<E>> extends AbstractSet<E>
implements Cloneable, Serializable {
// ...
//
public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) {
Enum<?>[] universe = getUniverse(elementType);
if (universe == null)
throw new ClassCastException(elementType + " not an enum");
if (universe.length <= 64)
return new RegularEnumSet<>(elementType, universe);
else
return new JumboEnumSet<>(elementType, universe);
}
private static class SerializationProxy<E extends Enum<E>> implements Serializable {
private static final long serialVersionUID = 362491234563181265L;
// μ΄ EnumSetμ μμ νμ
private final Class<E> elementType;
// μ΄ EnumSetμ μμλ€
private final Enum[] elements;
SerializationProxy(EnumSet<E> set) {
elementType = set.elementType;
elements = set.toArray(ZERO_LENGTH_ENUM_ARRAY);
}
private Object readResolve() {
EnumSet<E> result = EnumSet.noneOf(elementType);
for (Enum e : elements) {
result.add((E) e);
}
return result;
}
}
}
Last updated
Was this helpful?