So-net無料ブログ作成
検索選択

書籍『Effective Java, 3rd Edition』が予約注文可能 [Java]

発売日が2017年10月29日の予定になっていますが、英語版の『Effective Java, 3rd Edition』が予約注文可能になっています。

Effective Java (3rd Edition)

Effective Java (3rd Edition)




スポンサーリンク





Java誕生10周年の頃 [Java]

Javaが誕生してから今年で20年になり、今日は、Java Day Tokyo 2015が開催されます。私も1996年からのJavaとの付き合いになるので19年が過ぎたことになります。

10年前の2005年には、日本ではJavaOne Tokyoが開催されて、Java誕生10周年が祝われました。JavaOne会場では、バースデーケーキも登場し、壇上でハッピーバースデイも歌われました。

P1000291.JPG
JavaOne Tokyo会場

P1000268.JPG
2005年のJavaOne Tokyo

前年の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がサインしていました。

P1000283.JPG
Joshua Bloch氏のセッション


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

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

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

おそらく、日本版にだけ収録された「付録C」がなければ、もっと多くの部数が会場で販売されたはずです。しかし、付録Cは、日本語版に向けて新たに執筆された付録であり、英版には収録されていません。

JavaOneの前日には、Joshua Bloch氏とNeal Gafter氏、および、Java Puzzlersの翻訳レビューを手伝ってくれた人達とディナーを食べています。

P1000253.JPG
Joshua Bloch氏とNeal Gafter氏

テーブルの上には、私のTiger本があるので、その時に贈呈したのだと思います。この時以来、二人は来日していませんので、日本で二人と食事をしたのは、この時が最後です。写真を良くみると、Joshua Bloch氏は、『Java Puzzlers』のTシャツを着ています。Neal Gafter氏は、カエルのTシャツです。彼は、カエルが好きなので、カエルがプリントされたTシャツを着ていることが多いです。

Java SE 5.0に対応した『Effective Java, 2nd Edition』が発売されたのは、さらに遅れて2008年です。

P1010165.JPG
Book Storeで平積みされたEffective Java

写真は、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へ参加した時の写真です。

sg.jpg

写真の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();
}
この場合、次のコードを実行しても正しくクラスEtoStringメソッドが呼び出されます。
class CovariantReturnType {
    public static void main(String[] args) {
        C c = new E();
        C dup = c.dup();
        System.out.println(dup);
    }
}
この場合、c.dup()では、クラスDC dup();が呼ばれて、それがD dup();を呼び出すのですが、そのメソッドはクラスEでオーバーライドされているため、クラスED dup();を呼び出します。クラスED dup();は、E dup();を呼び出すという次第のようです。

ブリッジメソッド [Java]

社内で開催している「プログラミング言語Java」研修の受講生の一人から、拙著『Java 2 Standard Edition 5.0 Tiger』のp.25のjavapの出力が実際には違うという指摘を2度も受けたので、確認してみました。内容は、次の通りです。

次のように3つのクラスCDEがあります。
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";
    }
}
それで、この3つのクラスをコンパイルします。
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>
javacのバージョンは、1.6.0_21と表示されています。次に、javapコマンドでクラスEを調べます。
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();
}
本に書いてあるように、3つのdup()メソッドがあるのが分かります。受講生の主張は、2つしか表示されないというものでしたが、一体どんな環境で確認したのか疑問に残ります。

OracleからリリースされているJDKのjavac以外のコンパイラで、クラスEdup()が2つしか生成されないものがあるのでしょうか?

Google I/O 2011: Java Puzzlers - Scraping the Bottom of the Barrel [Java]



6個の新しいパズルが示されています。その内のいくつかは過去のパズルにひねりを入れたものとなっています。

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

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


PDF版『Java 2 Standard Edition 5.0 Tiger 拡張された言語仕様について』 [Java]

Java 2 Standard Edition 5.0 Tiger―拡張された言語仕様について

Java 2 Standard Edition 5.0 Tiger―拡張された言語仕様について


Kindleで見ることができるように日本語フォントを埋め込んだものも用意しました。
学習用に個人で利用(印刷やKindle等へのコピー)以外は禁止です。

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

(私も写っています)

境界ワイルドカード [Java]

プログラミング言語Java (The Java Series)

プログラミング言語Java (The Java Series)


本書の224頁の9行目に境界ワイルドカード(bounded wildcard)に関して次の制約が記述されています。
境界のある型変数と異なり、境界ワイルドカードは1 つの境界しか持つことができません。つまり、
1 つの上限境界か1 つの下限境界のどちらかです。たとえば、少なくともクラスValue であると同時 にSerializable を実装している要素を含んでいるリストの型に制限したいとしても、List<? extends Value & Serializable>とすることはできません。
実際には、直接的には、1つの境界しか持つことができないのですが、次のように代替することができます。

<T extends Value & Serializable> void foo(List<? extends T>)

なぜ、1つの境界しか持つことができないかについて、Neal Gafterに聞いたところ、複数の境界が指定できる箇所を制限したかったからだそうです。