『Effective Java 第3版』と『Java Puzzlers』ー パズル91 ー

『Effective Java 第3版』の「項目88 防御的にreadObjectメソッドを書く」で言及されているのがパズル91です。

パズル91 連続殺人犯(Serial Killer)


このプログラムは、オブジェクトを生成して、それがクラスの不変式に従っているかを検査しています。それから、プログラムはオブジェクトをシリアライズして、ディシリアライズし、そして、そのディシリアライズしたコピーもその不変式に従っているかを検査しています。 従っていますか? 従っていないとしたら、なぜですか?


import java.util.*;
import java.io.*;

public class SerialKiller {
public static void main(String[] args) {
Sub sub = new Sub(666);
sub.checkInvariant();

Sub copy = (Sub) deepCopy(sub);
copy.checkInvariant();
}

// シリアライズで引数をコピー(パズル80参照)
static public Object deepCopy(Object obj) {
try {
ByteArrayOutputStream bos =
new ByteArrayOutputStream();
new ObjectOutputStream(bos).writeObject(obj);
ByteArrayInputStream bin =
new ByteArrayInputStream(bos.toByteArray());
return new ObjectInputStream(bin).readObject();
} catch(Exception e) {
throw new IllegalArgumentException(e);
}
}
}

class Super implements Serializable {
final Set set = new HashSet();
}

final class Sub extends Super {
private int id;
public Sub(int id) {
this.id = id;
set.add(this); // 不変式の確立
}

public void checkInvariant() {
if (!set.contains(this))
throw new AssertionError("invariant violated");
}

public int hashCode() {
return id;
}

public boolean equals(Object o) {
return (o instanceof Sub) && (id == ((Sub)o).id);
}
}


Effective Java 第3版

Effective Java 第3版

  • 作者: Joshua Bloch
  • 出版社/メーカー: 丸善出版
  • 発売日: 2018/10/30
  • メディア: 単行本(ソフトカバー)

Java Puzzlers 罠、落とし穴、コーナーケース

Java Puzzlers 罠、落とし穴、コーナーケース

  • 作者: ジョシュア・ブロック
  • 出版社/メーカー: ピアソン・エデュケーション
  • 発売日: 2005/11/14
  • メディア: 大型本

この記事へのコメント