Java

java.exe の実行パスに環境変数 PATH の設定が反映されない(Windows)

java.exe は C:\Windows\System32 にもインストールされる。 したがって、下のように PATH の設定で %SystemRoot%\system32 が %JAVA_HOME%\bin よりも先に位置している場合、優先されるのは前者であるから、 %SystemRoot%\system32\java.exe が実行される。…

The Principle of Truth in Advertising および Principle of Indecent Exposure

Java では、配列よりも、List などのコレクション・オブジェクトを使用する方がメリットが遥かに大きい。 特にジェネリック型の配列は、発見しにくいバグも生みやすく、出来るだけ使用を避けるべきである。 ジェネリック型の配列を使わない、これが大原則で…

ArrayList の初期化イディオム

Java言語で固定要素のListを初期化する際のイディオム - 達人プログラマーを目指して List<String> list = Arrays.asList("data1", "data2", "data3"); だと、add()やremove()などの要素の追加削除はできないそうだ。同エントリのブクマコメントより。僕はArrays.asL</string>…

内部クラスからアクセス可能なローカル変数が final でなければならない理由

なぜ、内部クラス(ローカルクラス、匿名クラス)からアクセス可能なローカル変数が final でなければならないのか、 その理由が次の記事に説明されている。いまさらだけど、Java言語にはクロージャーがない - 達人プログラマーを目指してしかし、 つまり、…

やはり T.class や new T() をしなくてもよい。

Nagise氏の「ぶっちゃけるとT.class やnew Tしたいケースは設計が悪いのだと思う。」という言葉の通りなのか、Javaのジェネリクスで,T.class や new T() ができず悩んだ話 (型パラメータのインスタンス化に関し、フレームワーク設計からケーススタディ) -…

バージョンによる型推論アルゴリズムの違い

書籍『Java Generics and Collections』の 1.4 Generic Methods and Varargs の説明によると、 public class Lists { public static <T> List<T> toList(T... arr) { List<T> list = new ArrayList<T>(); for (T elt : arr) list.add(elt); return list; } } というコー</t></t></t></t>…

final 定数をインライン化しないで使用する

後々、変更されるような値を final 定数にすること自体が設計ミスであるが final 定数の値変更に対して再コンパイルを必要としないクライアントコードを書くことができる。具体的には、リフレクションによって定数値を読み込むことで final 定数をクライアン…

enum 定数の switch 文の実装

switch 文の case ラベルが int や short のプリミティブ型の final 定数であれば、その即値が switch 文にインライン展開される。 したがって、定数の値が変更されたら、その switch 文を使うクライアントコードは再コンパイルが必要になる。 ところが、列…

Javaの定数がインライン化される理由

Javaの定数がインライン化される理由は、実行時に switch 文のラベルの定数値に重複がないことをコンパイル時に保証することにある。 次のリンク先には Javaの定数がインライン化される理由について書かれている。トップ同じことが書籍『Java言語仕様 第3版…

ラッパークラスのキャッシング

基本データ型のラッパークラスのキャッシュが適用されるのは、ボクシング変換のときである。 Java Generics and Collections には次のような記述がある。Caching is required when boxing an int or short value between -128 and 127, a char value between…

Expression Problem の型安全性

ジェネリクスによるVisitorパターン拡張の考察2009-05-16 静的で安全に(キャストせず)、 元のコードを一切変更せず、 新しい場合分けを加え、 新しい操作も加えた 新しい場合分け構造を定義する 以下のコードは、条件2〜5を満たすが、 1.静的で安全に(キャス…