Kindle版『Effective Java 第3版』 [Effective Java 第3版]
出版当初は、電子版としてDRMフリーではありませんが、PDF版がリリースされていました。Kindle版についても新たにリリースされました。ただし、以下の制約があります。
- リフローではなく固定レイアウトで、文字列のハイライトや検索、辞書の参照、引用などの機能が使えない
- 紙の本の第1刷と内容は同じであり、紙の本で見つかっている誤りは修正されていない(正誤表はこちらです)。
2019-05-15 03:24
コメント(0)
『Effective Java 第3版』の正誤表 [Effective Java 第3版]
『Effective Java 第3版』の正誤表を私のホームページに用意しました。
「正誤表」のタグを選んでもらえれば表示されます。
2018-10-31 17:10
コメント(0)
『Effective Java 第3版』と『Java Puzzlers』ー パズル91 ー [Effective Java 第3版]
『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 Setset = 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); } }
2018-10-22 06:42
コメント(0)
『Effective Java 第3版』と『Java Puzzlers』ー パズル51 ー [Effective Java 第3版]
『Effective Java 第3版』の「項目83 遅延初期化を注意して使う」で言及されているのがパズル51です。
パズル51 何が言いたいの?(What's the Point?)
このプログラムは、2つの不変な値クラス(value class)、すなわち、そのイン>スタンスが値を表すクラスを持っています。1つのクラスは、整数座標を持つ面上の点を表しています。そして、2番目のクラスは、このパズルにちょっと色を添えています。main
プログラムは、2番目のクラスのインスタンスを生成して表示しています。このプログラムは、何を表示しますか?
class Point { protected final int x, y; private final String name; // 生成時にキャッシュされる Point(int x, int y) { this.x = x; this.y = y; name = makeName(); } protected String makeName() { return "[" + x + "," + y + "]"; } public final String toString() { return name; } } public class ColorPoint extends Point { private final String color; ColorPoint(int x, int y, String color) { super(x, y); this.color = color; } protected String makeName() { return super.makeName() + ":" + color; } public static void main(String[] args) { System.out.println(new ColorPoint(4, 2, "purple")); } }
2018-10-21 06:34
コメント(0)
『Effective Java 第3版』と『Java Puzzlers』ー パズル77ー [Effective Java 第3版]
『Effective Java 第3版』の「項目82 スレッド安全性を文書化する」で参照されているのは、パズル77です。
パズル77 ロックを混乱させる怪物(The Lock Mess Monster)
このプログラムは、ちょっとした職場シミュレーションを行います。退社時間まで仕事をする、あるいは、少なくとも仕事をしているふりをするワーカースレッドを、プログラムは開始します。 それから、決して退社時間にならないようにしようとしている邪悪な上司を表しているタイマータスクを、プログラムはスケジュールします。 最後に、良い上司を表しているメインスレッドは、ワーカーに退社時間だと告げて、ワーカーが終了するのを待ちます。 このプログラムは、何を表示しますか?import java.util.*; public class Worker extends Thread { private volatile boolean quittingTime = false; public void run() { while (!quittingTime) pretendToWork(); System.out.println("Beer is good"); } private void pretendToWork() { try { Thread.sleep(300); // 仕事中に寝ている? } catch (InterruptedException ex) { } } // 退社時間。作業者を待つ - 良い上司から呼ばれる synchronized void quit() throws InterruptedException { quittingTime = true; join(); } // 退社時間を取り消す - 邪悪な上司から呼ばれる synchronized void keepWorking() { quittingTime = false; } public static void main(String[] args) throws InterruptedException { final Worker worker = new Worker(); worker.start(); Timer t = new Timer(true); // デーモンスレッド t.schedule(new TimerTask() { public void run() { worker.keepWorking(); } }, 500); Thread.sleep(400); worker.quit(); } }
2018-10-20 07:11
コメント(0)
『Effective Java 第3版』と『Java Puzzlers』ー パズル 2 ー [Effective Java 第3版]
『Effective Java 第3版』で2番目に言及されているのはパズル2です。
私自身は、金銭計算に
英語版ならKindle版が購入可能です(紙の本も買えるようです)。Kindle版は見たことがないのですが、錯視図はどうなっているのでしょうか(誰か教えてください)。
パズル2 変革の時(Time for a Change)このパズルが言及されているのは『Effective Java 第3版』の「項目60 正確な答えが必要ならば、
次の文章問題を考えてみてください。トムは、$1.10するスパークプラグを購入するために自動車部品店に行きますが、財布の中にあるのは2ドル紙幣ばかりです。2ドル紙幣でスパークプラグの代金を支払ったとしたら、彼は、お釣りをいくら貰うでしょうか。この文章問題を解こうとしているのが、次のプログラムです。このプログラムは、何を表示しますか?public class Change { public static void main(String args[]) { System.out.println(2.00 - 1.10); } }
float
とdouble
を避ける」です。私自身は、金銭計算に
float
やdouble
を使うべきではないことをいつ、どこで学んだのか覚えていません。しかし、このパズルのようにfloat
やdouble
を使ったコードを見かけることがたまにあります。昨年は1回だけ見かけたので、その時は『Effective Java 第2版』の該当項目を教えてあげました。英語版ならKindle版が購入可能です(紙の本も買えるようです)。Kindle版は見たことがないのですが、錯視図はどうなっているのでしょうか(誰か教えてください)。
Puzzlers: Traps, Pitfalls, and Corner Cases" title="Java Puzzlers: Traps, Pitfalls, and Corner Cases">
Java Puzzlers: Traps, Pitfalls, and Corner Cases
- 出版社/メーカー: Addison-Wesley Professional
- 発売日: 2005/06/24
- メディア: Kindle版
2018-10-16 17:29
コメント(0)
『Effective Java 第3版』と『Java Puzzlers』ー パズル41ー [Effective Java 第3版]
『Effective Java 第3版』で最初に言及されているのは、パズル41の解答です。パズル41は、以下の通りです。
パズル41 フィールドとストリーム(Field and Stream)言及されているのは、このパズルの解答として書かれていた
次のメソッドは、1つのファイルを他のファイルへコピーし、I/Oエラーが発生しても、生成したすべてのストリームをクローズするように設計されていました。残念ながら、常にそのようには動作しません。なぜ動作しないのでしょうか? 修正することができますか?
static void copy(String src, String dest) throws IOException { InputStream in = null; OutputStream out = null; try { in = new FileInputStream(src); out = new FileOutputStream(dest); byte[] buf = new byte[1024]; int n; while ((n = in.read(buf)) > 0) out.write(buf, 0, n); } finally { if (in != null) in.close(); if (out != null) out.close(); } }
finally
節のコードです。この解答も間違っています。何が間違っているか分かりますか?『Effective Java 第3版』の「項目9 try-finally よりもtry-with-resources を選ぶ」に解説されています。} finally { if (in != null) { try { in.close(); } catch (IOException ex) { // closeが失敗しても、できることはない } } if (out != null) { try { out.close(); } catch (IOException ex) { // 再度、closeが失敗しても、できることはない } } }
2018-10-15 06:30
コメント(0)
『Effective Java 第3版』届きました [Effective Java 第3版]
正式な発行日は10月30日ですが、見本刷りが出来上がったので、土曜日のお昼に出版社から届きました。
2001年に初版を読んだときは、自分自身の無知を自覚しました。1996年夏からJavaを使っていて、すでに5年も経過しているのに、初版からあまりにも学ぶことが多すぎて、衝撃を受けたものです。
今月末までには書店に並ぶと思います。
2001年に初版を読んだときは、自分自身の無知を自覚しました。1996年夏からJavaを使っていて、すでに5年も経過しているのに、初版からあまりにも学ぶことが多すぎて、衝撃を受けたものです。
今月末までには書店に並ぶと思います。
2018-10-14 06:47
コメント(0)
『Effective Java 第3版』 [Effective Java 第3版]
私にとって17冊目の翻訳本になる『Effective Java 第3版』が今月末には書店に並びます。第2版がちょうど10年前です。第2版は、ジェネリックスを含めた大きな言語仕様の変更がJava 5で行われた後でした。今回は、Java 8でラムダとストリームという言語仕様の変更とライブラリの拡張が行われた後となります。
新たに追加された項目は以下の通りです(項目番号は、第3版の番号です)。
- 項目9 try-finally よりもtry-with-resources を選ぶ
- 項目21 将来のためにインタフェースを設計する
- 項目25 ソースファイルを単一のトップレベルのクラスに限定する
- 項目32 ジェネリックスと可変長引数を注意して組み合わせる
- 項目43 ラムダよりもメソッド参照を選ぶ
- 項目44 標準の関数型インタフェースを使う
- 項目45 ストリームを注意して使う
- 項目46 ストリームで副作用のない関数を選ぶ
- 項目47 戻り値型としてStream よりもCollection を選ぶ
- 項目48 ストリームを並列化するときは注意を払う
- 項目55 オプショナルを注意して返す
- 項目85 Java のシリアライズよりも代替手段を選ぶ
既存の項目も見直しが行われています。
今回も翻訳作業を通して原著の間違いを多く発見し、その多くは英版版の4th printingで修正されています。
2018-10-02 06:53
コメント(0)
延期:『Effective Java, 3rd edition』 [Effective Java 第3版]
『Effective Java, 3rd edition』の英語版の発売日が延期されたようです。12月29日発売となっています。
2017-09-02 16:04
コメント(5)
この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。