『Effective Java 第3版』で言及されている書籍 [Java]
『Effective Java 第3版』の本文中で言及されている参考文献には多くの書籍がありますが、最も参照されているのは『The Java Language Specification』です。当然と言えば当然ですが、残念ながら言語仕様は今では翻訳されていませんし、おそらく今後も翻訳されないと思います。
正確に数えた訳ではありませんが、次に多く言及されているのは、やはり『デザインパターン』です。
原著は20年以上前に出版されており、古典と言ってもよいかと思います。2000年前後にデザインパターンがブームとなった頃にはさまざまな書籍が出版されてましたが、最近は新刊はほとんどないです。知らなくてもよくなったのではなく、知っておきべき「常識」となったと考えるのが正しいと思います。この本の注意点は、サンプルコードがC++だということです。
次に言及が多いのが次の本です。
Java並行処理プログラミング ―その「基盤」と「最新API」を究める―
- 作者: Brian Goetz
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2006/11/22
- メディア: 単行本
『Effective Java 第3版』の「第11章 並行性」で言及されています。
次に言及が多いのがJoshua Bloch自身が共著者の一人である『Java Puzzlers』です
2005年に出版されたこの本は、多くのパズルが含まれ、その解説だけでなく「言語設計者への教訓」が書かれています。また、多くの錯視図が含まれており楽しめます。さらに、パズルそのものやそのタイトルには多くの語呂合わせが含まれており、楽しめる技術書となっています。この『Java Puzzlers』は、私が初めて原著の草稿段階からレビューに参加させてもらった書籍です。
「付録A 罠と落とし穴のカタログ」には、Javaでプログラミングを行う上での助言が書かれており、『Effective Java』と共通する助言が多いです。「付録B 錯視に関する説明」では錯視図の説明が書かれています。「付録C 語呂合わせとポップカルチャー参照」は、私がJoshua Blochへ依頼して執筆してもらった付録であり、日本人には分かりにくい本文中のジョークや文化的背景が説明されています。
この本は、2005年に本で開催されたJavaOneで先行発売され、著者のJoshua BlochとNeal Gafterも来日していたので、会場でサインをもらった人もいるのではないかと思います。
初刷が2,500部だけで、すでに絶版となっていますので、『Effective Java』で言及されているパズルを今後紹介していきたいと思います。
2018-10-06 14:40
コメント(0)
Java誕生10周年の頃 [Java]
Javaが誕生してから今年で20年になり、今日は、Java Day Tokyo 2015が開催されます。私も1996年からのJavaとの付き合いになるので19年が過ぎたことになります。
10年前の2005年には、日本ではJavaOne Tokyoが開催されて、Java誕生10周年が祝われました。JavaOne会場では、バースデーケーキも登場し、壇上でハッピーバースデイも歌われました。
前年の2004年には、Java SE 5.0が登場し、ジェネリックス、enum、アノテーションなどが追加されました。写真の左から2人目は、その5.0のコンパイラを一人で書いたNeal Gafter氏です。
この年には、Joshua Bloch氏とNeal Gafter氏が執筆した『Java Puzzlers』が出版されました。『Java Puzzlers』の日本語版は、このJavaOneに間にぎりぎり間に合い、会場では100冊が販売され、Joshua BlochやNeal Gafterがサインしていました。
おそらく、日本版にだけ収録された「付録C」がなければ、もっと多くの部数が会場で販売されたはずです。しかし、付録Cは、日本語版に向けて新たに執筆された付録であり、英版には収録されていません。
JavaOneの前日には、Joshua Bloch氏とNeal Gafter氏、および、Java Puzzlersの翻訳レビューを手伝ってくれた人達とディナーを食べています。
テーブルの上には、私のTiger本があるので、その時に贈呈したのだと思います。この時以来、二人は来日していませんので、日本で二人と食事をしたのは、この時が最後です。写真を良くみると、Joshua Bloch氏は、『Java Puzzlers』のTシャツを着ています。Neal Gafter氏は、カエルのTシャツです。彼は、カエルが好きなので、カエルがプリントされたTシャツを着ていることが多いです。
Java SE 5.0に対応した『Effective Java, 2nd Edition』が発売されたのは、さらに遅れて2008年です。
写真は、2008年5月にサンフランシスコで開催されたJavaOne会場のBook Storeに平積みになった『Effective Java, 2nd Edition』です。
Java 8に対応した第3版については、まだ何も聞いていません。しかし、ある日突然、「Yes, it's Effective Java time again」というタイトルのメールが、Joshua Bloch氏から送られてくるのを楽しみにしています。
10年前の2005年には、日本ではJavaOne Tokyoが開催されて、Java誕生10周年が祝われました。JavaOne会場では、バースデーケーキも登場し、壇上でハッピーバースデイも歌われました。
前年の2004年には、Java SE 5.0が登場し、ジェネリックス、enum、アノテーションなどが追加されました。写真の左から2人目は、その5.0のコンパイラを一人で書いたNeal Gafter氏です。
この年には、Joshua Bloch氏とNeal Gafter氏が執筆した『Java Puzzlers』が出版されました。『Java Puzzlers』の日本語版は、このJavaOneに間にぎりぎり間に合い、会場では100冊が販売され、Joshua BlochやNeal Gafterがサインしていました。
おそらく、日本版にだけ収録された「付録C」がなければ、もっと多くの部数が会場で販売されたはずです。しかし、付録Cは、日本語版に向けて新たに執筆された付録であり、英版には収録されていません。
JavaOneの前日には、Joshua Bloch氏とNeal Gafter氏、および、Java Puzzlersの翻訳レビューを手伝ってくれた人達とディナーを食べています。
テーブルの上には、私のTiger本があるので、その時に贈呈したのだと思います。この時以来、二人は来日していませんので、日本で二人と食事をしたのは、この時が最後です。写真を良くみると、Joshua Bloch氏は、『Java Puzzlers』のTシャツを着ています。Neal Gafter氏は、カエルのTシャツです。彼は、カエルが好きなので、カエルがプリントされたTシャツを着ていることが多いです。
Java SE 5.0に対応した『Effective Java, 2nd Edition』が発売されたのは、さらに遅れて2008年です。
写真は、2008年5月にサンフランシスコで開催されたJavaOne会場のBook Storeに平積みになった『Effective Java, 2nd Edition』です。
Java 8に対応した第3版については、まだ何も聞いていません。しかし、ある日突然、「Yes, it's Effective Java time again」というタイトルのメールが、Joshua Bloch氏から送られてくるのを楽しみにしています。
JavaOne 2007のコラージュ写真 [Java]
長い間使用していなかったので忘れていたのですが、FX Palo Alto Laboratoryが運営していたStainedGlass Collageのサービス停止の案内がきました。ほとんど利用していませんでしたが、作成していたコラージュの写真をダウンロードしました。下のコラージュは、2007年にサンフランシスコで開催されたJavaOneへ参加した時の写真です。
写真の1行目の左から、David Geary氏です。私が大変お世話になった「Graphic Java」の著者です。JavaOneで初めて会い、この後、彼の『Google Web Toolkit Solutions』を翻訳することになります。その右の写真は、JavaOne会場のBookstoreで、『Java Puzzlers』にサインをしているNeal Gafter氏とJoshua Bloch氏です。その右の写真は、左が私であり、右はDavid Holmes氏です。『プログラミング言語Java第3版』の翻訳を通してメールのやり取りは7年ぐらいしていたのですが、この時初めて会いました。一番右の写真は、Neal Gafter氏です。
2行目の左から最初の写真では、左から、私、Joshua Bloch氏、Bill Pugh氏(FindBugsの生みの親)です。右端の写真は、左から、Maurice Naftalin氏(『Java Generics and Collections』の著者)、Joshua Bloch氏、私です。
3行目の左から最初の写真は、JavaOne会場とは全く別の場所でGoogleが主催していてパーティ会場の入り口の写真です。招待制となっていました。このパーティの前に、Google Web Toolkitチームによる技術セミナーがあり、私は、そこで初めてGWTを知りました。パーティ会場には、この写真に写っている人はほとんどいました。次の写真は、左の人の名前は忘れたましたが、その隣りは、David Holmes氏です。その次は、Bill Pugh氏とJoshua Bloch氏です。最後の写真は、Brian Goetz氏とJoshua Bloch氏です。
StainedGlass Collageのサービスは、この頃に始まったサービスであり、JavaOneの後にFX Palo Alto Laboratoryを訪問した際に、説明を受けたのを覚えています。
写真の1行目の左から、David Geary氏です。私が大変お世話になった「Graphic Java」の著者です。JavaOneで初めて会い、この後、彼の『Google Web Toolkit Solutions』を翻訳することになります。その右の写真は、JavaOne会場のBookstoreで、『Java Puzzlers』にサインをしているNeal Gafter氏とJoshua Bloch氏です。その右の写真は、左が私であり、右はDavid Holmes氏です。『プログラミング言語Java第3版』の翻訳を通してメールのやり取りは7年ぐらいしていたのですが、この時初めて会いました。一番右の写真は、Neal Gafter氏です。
2行目の左から最初の写真では、左から、私、Joshua Bloch氏、Bill Pugh氏(FindBugsの生みの親)です。右端の写真は、左から、Maurice Naftalin氏(『Java Generics and Collections』の著者)、Joshua Bloch氏、私です。
3行目の左から最初の写真は、JavaOne会場とは全く別の場所でGoogleが主催していてパーティ会場の入り口の写真です。招待制となっていました。このパーティの前に、Google Web Toolkitチームによる技術セミナーがあり、私は、そこで初めてGWTを知りました。パーティ会場には、この写真に写っている人はほとんどいました。次の写真は、左の人の名前は忘れたましたが、その隣りは、David Holmes氏です。その次は、Bill Pugh氏とJoshua Bloch氏です。最後の写真は、Brian Goetz氏とJoshua Bloch氏です。
StainedGlass Collageのサービスは、この頃に始まったサービスであり、JavaOneの後にFX Palo Alto Laboratoryを訪問した際に、説明を受けたのを覚えています。
ブリッジメソッド(2) [Java]
櫻庭さんから、Eclipseでコンパイルされたものは、JDKと異なるというコメントをいただきましたので調べてみました。Eclipseでコンパイルされたものをjavapで調べて見ると次のようになりました。
この場合、次のコードを実行しても正しくクラスC:\Users\Yoshiki Shibata\workspace\bridgemethod\bin>javap C Compiled from "C.java" class C extends java.lang.Object{ C(); C dup(); public java.lang.String toString(); } C:\Users\Yoshiki Shibata\workspace\bridgemethod\bin>javap D Compiled from "D.java" class D extends C{ D(); D dup(); public java.lang.String toString(); C dup(); } C:\Users\Yoshiki Shibata\workspace\bridgemethod\bin>javap E Compiled from "E.java" class E extends D{ E(); E dup(); public java.lang.String toString(); D dup(); }
E
のtoString
メソッドが呼び出されます。この場合、class CovariantReturnType { public static void main(String[] args) { C c = new E(); C dup = c.dup(); System.out.println(dup); } }
c.dup()
では、クラスD
のC dup();
が呼ばれて、それがD dup();
を呼び出すのですが、そのメソッドはクラスE
でオーバーライドされているため、クラスE
のD dup();
を呼び出します。クラスE
のD dup();
は、E dup();
を呼び出すという次第のようです。
ブリッジメソッド [Java]
社内で開催している「プログラミング言語Java」研修の受講生の一人から、拙著『Java 2 Standard Edition 5.0 Tiger』のp.25のjavapの出力が実際には違うという指摘を2度も受けたので、確認してみました。内容は、次の通りです。
次のように3つのクラス
OracleからリリースされているJDKのjavac以外のコンパイラで、クラス
次のように3つのクラス
C
、D
、E
があります。それで、この3つのクラスをコンパイルします。class C { C dup() { return new C(); } public String toString() { return "instance of class C"; } } class D extends C { D dup() { // 共変戻り値型 return new D(); } public String toString() { return "instance of class D"; } } class E extends D { E dup() { return new E(); } public String toString() { return "instance of class E"; } }
javacのバージョンは、1.6.0_21と表示されています。次に、javapコマンドでクラスEを調べます。C:\Users\Yoshiki Shibata\Desktop\ftp\code\code\024>javac -version javac 1.6.0_21 C:\Users\Yoshiki Shibata\Desktop\ftp\code\code\024>javac E.java C:\Users\Yoshiki Shibata\Desktop\ftp\code\code\024>
本に書いてあるように、3つのC:\Users\Yoshiki Shibata\Desktop\ftp\code\code\024>javap E Compiled from "E.java" class E extends D{ E(); E dup(); public java.lang.String toString(); D dup(); C dup(); }
dup()
メソッドがあるのが分かります。受講生の主張は、2つしか表示されないというものでしたが、一体どんな環境で確認したのか疑問に残ります。OracleからリリースされているJDKのjavac以外のコンパイラで、クラス
E
のdup()
が2つしか生成されないものがあるのでしょうか?
Google I/O 2011: Java Puzzlers - Scraping the Bottom of the Barrel [Java]
PDF版『Java 2 Standard Edition 5.0 Tiger 拡張された言語仕様について』 [Java]
Java 2 Standard Edition 5.0 Tiger―拡張された言語仕様について
- 作者: 柴田 芳樹
- 出版社/メーカー: ピアソンエデュケーション
- 発売日: 2005/04/1
- メディア: 単行本
PDF版は、以下のリンクからダウンロードできます。
個人の学習用の使用以外は禁止です。
RICOH & Java™ Developer Challenge 2010 [Java]
RICOH & Java Developer Challenge 2010 [Java]
今年で3回目となる「RICOH & Java™ Developer Challenge 2010」のページです。
http://www.ricoh.co.jp/javachallenge/
前回は、最終審査から参加させてもらいました。2010年の大会のマイコミジャーナルの紹介記事はこちらです。
http://journal.mycom.co.jp/news/2010/04/02/074/index.html
2009年の最終選考会のマイコミジャーナルの紹介記事はこちらです。
http://journal.mycom.co.jp/articles/2010/01/19/richo_and_sun/index.html
(私も写っています)
http://www.ricoh.co.jp/javachallenge/
前回は、最終審査から参加させてもらいました。2010年の大会のマイコミジャーナルの紹介記事はこちらです。
http://journal.mycom.co.jp/news/2010/04/02/074/index.html
2009年の最終選考会のマイコミジャーナルの紹介記事はこちらです。
http://journal.mycom.co.jp/articles/2010/01/19/richo_and_sun/index.html
(私も写っています)
境界ワイルドカード [Java]
プログラミング言語Java (The Java Series)
- 作者: ケン・アーノルド
- 出版社/メーカー: ピアソンエデュケーション
- 発売日: 2007/04
- メディア: 単行本
本書の224頁の9行目に境界ワイルドカード(bounded wildcard)に関して次の制約が記述されています。
境界のある型変数と異なり、境界ワイルドカードは1 つの境界しか持つことができません。つまり、
1 つの上限境界か1 つの下限境界のどちらかです。たとえば、少なくともクラス実際には、直接的には、1つの境界しか持つことができないのですが、次のように代替することができます。Value
であると同時 にSerializable
を実装している要素を含んでいるリストの型に制限したいとしても、List<? extends Value & Serializable>
とすることはできません。
<T extends Value & Serializable> void foo(List<? extends T>)
なぜ、1つの境界しか持つことができないかについて、Neal Gafterに聞いたところ、複数の境界が指定できる箇所を制限したかったからだそうです。