本ブログの更新について
本ブログの更新は2016年3月31日をもって終了しました.ありがとうございました.
posted by みっちぃ (管理人)
2008年01月31日
解決しました・・・.
先日「Java嫌いになりそう」と題して,Javaプログラミングで問題を解決できずにハマっている旨を記しましたが,原因が判明しました.問題の犯人は,javawでもなく,他のバージョンのjarファイルでもなく,新バージョンで追加した自分のコードでした.
先の記事でJpegGpxMergerMain.DEF_VERSIONに関わる処理を呼び出しているところが,AboutDialogクラス以外にも数箇所あります.そのうちの1つは以下のようなコーディングをしていました.
ここで注意しなければならないのは,JpegGpxMergerMain.DEF_VERSIONを「private static final」で宣言していても,今回の事例のように配列要素の値を変えることができてしまうということです.このことは冷静に考えればごく当然です.finalはJpegGpxMergerMain.DEF_VERSIONの参照先を固定しているに過ぎないからです.
このことに気づくと「private static final」としてDEF_VERSIONを宣言し,「public static」なgetVersionDigits()を定義する意味がないことにも気づきます.DEF_VERSIONは「public static final」と定義してgetVersionDigits()は削除すべきかもしれません.
この意味が解らないJava初心者の方々は,ぜひ右の本を熟読することをオススメします.というか,この本はJava技術者は必読すべき本です(本事例は59ページに明記されています).私自身,この本を読んでいたにもかかわらず活かすことができませんでした.やはり,読むだけでなく日頃の実践も必要であることを実感しています.悪いお手本プログラミングをしてしまいました・・・・.
あともう1つの教訓は,“ハマった時には寝て頭を冷やせ”ということでしょうか・・・.
先の記事でJpegGpxMergerMain.DEF_VERSIONに関わる処理を呼び出しているところが,AboutDialogクラス以外にも数箇所あります.そのうちの1つは以下のようなコーディングをしていました.
int[] iFileVersion = JpegGpxMergerMain.getVersionDigits();JpegGpxMergerMain.getVersionDigits()は先の記事には書いていませんでしたが,JpegGpxMergerMain.DEF_VERSIONの「public static」なGetterです.iFileVersionは,機能設定ファイルのファイルバージョンを表す変数です.あらかじめ,現在の実行プログラムのバージョンを代入しておき,設定ファイルをロードするときに,ファイルに示されているバージョンで置き換える実装となっていました.つまり,iFileVersionの配列要素に値を代入する処理を書いていたのです.宣言の際,iFileVersionはJpegGpxMergerMain.DEF_VERSIONの参照になっていますので,iFileVersionの配列要素に値を代入すると,大元のJpegGpxMergerMain.DEF_VERSIONの値も変わってしまうのです.
ここで注意しなければならないのは,JpegGpxMergerMain.DEF_VERSIONを「private static final」で宣言していても,今回の事例のように配列要素の値を変えることができてしまうということです.このことは冷静に考えればごく当然です.finalはJpegGpxMergerMain.DEF_VERSIONの参照先を固定しているに過ぎないからです.
このことに気づくと「private static final」としてDEF_VERSIONを宣言し,「public static」なgetVersionDigits()を定義する意味がないことにも気づきます.DEF_VERSIONは「public static final」と定義してgetVersionDigits()は削除すべきかもしれません.
あともう1つの教訓は,“ハマった時には寝て頭を冷やせ”ということでしょうか・・・.
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/10310299
この記事へのトラックバック
http://blog.sakura.ne.jp/tb/10310299
この記事へのトラックバック