2008年6月24日火曜日

[Java]ローカル変数に対するfinalの意味

Javaで、ローカル変数にfinalを付けると、その変数は変更されないということを保障します。
では、変更しないローカル変数には全てfinalを付けるべきなのでしょうか?

今回は、必ずfinalを付けざるを得ない、以下のコードのような場合を考えてみたいと思います。


class DisplayImpl implements Display {
private JFrame frame;

public DisplayImpl(int width, int height) {
final Dimension size =
new Dimension(width, height);

// ① finalで宣言

frame = new JFrame() {
Dimension getPrefferedSize() {
return size;
// ② finalでないと参照できない
}
};

size.height = 5; // ③ OK

size = null; // ④ コンパイル・エラー
}
}

JFrameを派生した内部無名クラスからローカル変数sizeにアクセスする場合、final宣言が必要です。

これは評価のタイミングで、無名クラスが生成されるタイミングが、コードの順番どおりという訳ではないので、例えば、④のようにnullを代入してしまうと、冒頭でnewしたDimensionオブジェクトを参照していいのか、nullを代入したあとの値を参照していいのかの判断がつかないためだと思われます。

しかし、Javaではプリミティブ型以外は全て参照ですので、参照先を変更する(③のような)コードならOKなのです。

ソースコードを検査するあるツールを入れたりすると、変更していないローカル変数にfinalが付いていない旨のエラーがでることがあります(設定次第)。

そうなると、参照型のローカル変数というのは大抵、finalを付けないといけないということになってしまいます。

同じローカル変数に何度も別のオブジェクトを割り当てたり、わざわざnullを設定するようなことが少ないからです。

結論として、個人的なルールとしてはローカル内部クラスか無名内部クラスからアクセスする場合のみfinalを付けるという方針をとることにしました。

『プログラミング言語Java 第4版』P151にも、同様の意見が書かれていました。

2008年6月18日水曜日

.svnフォルダの削除(メモ)

削除したいディレクトリに移動して、以下のコマンドを実行。

for /R %i in (.svn) do rd /Q /S "%i"


↑普段はsvn exportを使えば良いのですが、バックアップの削除のときなどに。

2008年6月17日火曜日

メイリオ on Emacs-22


メイリオというフォントがあるようですね。Windows Vistaのフォントだそうで…
Vistaは仕事関係でもまったく縁がないので触ったこともないですが、このフォントだけ欲しいなと思い探しました。

理由は、前々からWindowsにはClearTypeというフォントを滑らかにする機能があるのを知っていて、使いたかったのですが、ビットマップフォントには効かないのだそうで…

MS明朝やMSゴシックでは、16ポイント以下のフォントがビットマップになってしまうので(回避する方法はあるようですが)、メイリオならと思った訳です。

それともうひとつ、こちらのほうが大事ですが、Emacs-22の日本語フォントが汚くて…いろいろ物色していたらメイリオに出会ったという訳です。

nobさんのサイトを参考に設定しようとしましたが、Windows版のEmacs-22の設定ファイル(.emacs)がどこにあるのか(どこに作るのか)分からなくて断念。

ブラウザのデフォルトフォントをメイリオにして気分を変えてみましたが、今日はここまで^^;