yuu_nkjm blog
2008-12-15(Mon) [長年日記] 編集
[Java][技術書] 結城 浩 - 増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編
「結城 浩- 増補改訂版Java言語で学ぶデザインパターン入門」が良かったので,マルチスレッド編も買ってみた.マルチスレッドプログラミングの経験が無い人でも読みやすかった(7章までしか読んでないけど).また,Java上でのメモリの扱われ方,Java上での同期処理などについて書かれていて,その部分も役に立った.デザインパターンと銘打っているが,そんなにパターン感はなかった.
7章までを読んだところでは,「シングルスレッドで動く二つのプログラムを作成し,同期処理をするための層を間に挟む構成」とするのが基本のようだ.同期処理を間の層に押し込めば,他の二つのプログラムはマルチスレッドを意識しなくて良くなる.
[ツッコミを入れる]
2008-12-16(Tue) [長年日記] 編集
[Java][Scrap] JComponentのpaintとrepaint
描画そのものは(文字の描画も含め)、JComponentまたはJPanelをextendsした自作クラスのpublic void paintComponent(Graphics g)メソッドに書きます。描画の経時変化(アニメーション)は、javax.swing.Timerクラスを作り、その actionPerforemed()メソッドの中でpaintComponent()メソッドが使っているパラメータの値を適宜変えて、そのパネルオブジェクトのrepaint()をコールします。 質問があいまいなので何とも言えないけど 同じような質問が定期的にあるので推測で回答します。 まず JComponentのJavaDoc、repaint には下記のようにかかれてます。 ------------------------------------------ コンポーネントが表示されている場合に、 指定された領域をダーティーリージョンリストに追加します。 コンポーネントは、現在保留されているすべてのイベントが ディスパッチされたあとに再描画されます。 ------------------------------------------ つまりrepaintは再描画処理の予約であり再描画処理そのものではありません。
次状態の計算,描画用データの更新,repaintの呼び出しをどう組み合わせれば良いのか,まだ勘がはたらかない.
[ツッコミを入れる]
2008-12-17(Wed) [長年日記] 編集
[Java][Scrap] Javaの実装イロイロ
株式会社エス・ジーさんのJava講座で取り上げられていた内容のうち,僕が気になったものを抜き書きします.
2. 堅牢性を獲得する章
2.5. 配列フィールド定数 『目的』 定数として用意した配列は書きかえられないようにしましょう。 『まとめ』 書き方を改めることで「定数」となります。 final修飾子は参照を不変にするだけで内容までは不変にしてくれません。
3. 拡張性/柔軟性を獲得する章
valueOf:型変換的なファクトリーメソッド getInstance:それ以外なファクトリーメソッド
改行コードをハードコーディングしないようにします。
// 改行を文字列に含める
StringBuffer str = new StringBuffer();
str.append("Hello");
// プラットフォームに適した改行コードを取得\
str.append(System.getProperty("line.separator"));
str.append(name);
『まとめ』
改行コードはハードコーディングしないこと。
改行コードが欲しければSystem.getProperty("line.separator")を使うこと。
4. 知っていると便利な章
4.10. コレクションと配列のやりとり 『目的』 コレクションと配列間のやりとりを簡潔に行いましょう。 /* Collection -> 配列 */ String[] strings = (String[]) values.toArray(new String[values.size()]); 『まとめ』 Arrays.asListとCollection.toArrayの組み合わせが配列ベースのAPIとコレクションベースのAPIの橋渡しをします。 ArraysやCollectionには便利なメソッドが色々用意されているので積極的に使いましょう。
5. 最適化の章
Java講座 > 5.1. ループ条件部でメソッドコールしない
5.1. ループ条件部でメソッドコールしない
ループ条件でのメソッド呼び出しを避けて実行速度を上げましょう。
List strings = Collections.synchronizedList(new ArrayList());
:
for (int i = 0, n = strings.size(); i < n; i++) {
:
}
5.2. ループ内でインスタンス化しない
『目的』
インスタンス化方法を改善してメモリ管理の負荷を下げましょう。
ループ外で作ったものをループ内で使い回すようにします。
StringBuffer sb = new StringBuffer(); /* ループ外に出した */
for (int i = 0; i < max; i++) {
sb.append("loop: ");
sb.append(i);
System.out.println(sb.toString());
sb.setLength(0); /* 使い回すので内容をクリア */
}
Java講座 > 5.3. try-catch ブロックはループ外に置く
5.3. try-catch ブロックはループ外に置く 『目的』
try-catch ブロックの書き方で実行速度を改善しましょう。
try-catch ブロックの括りを外に出してみます。
try { /* 括りをループの外に出しました */
for (int i = 0; i < MAX; i++) {
FileInputStream fis = new FileInputStream("c:\\hoge\\foo\bar.dat");
}
} catch (FileNotFoundException e) {
/* 繰り返して行う必要がない例外処理。 */
}
[ツッコミを入れる]