Java
今回は「項目28:API の柔軟性向上のために境界ワイルドカードを使用する」。 項目28はけっこう長いので2回に分割した。 不変性による弊害 項目25で説明したように Java のジェネリックスは不変です。 Object は Number のスーパータイプですが、List<Object></object>…
ポイント ジェネリックメソッドを利用しよう ジェネリックメソッドは型推論を行う ジェネリック static ファクトリーメソッド 型推論を利用したテクニック ただし、現代にいるならダイヤモンド演算子を使うべき ジェネリックシングルトンファクトリー それぞ…
ジェネリック型を使う 今回は簡単にジェネリック型の使い方・書き方について説明します。 項目6での説明に利用したスタックの実装を、ジェネリックスを用いた実装に置き換えることを例としてみます。 ジェネリックスを利用しない元のスタック実装は以下の通…
ジェネリックスと配列 前回の記事 ではジェネリックス型の不変、共変、反変について説明しました。 今回はジェネリクス型のリスト(List<E>)と配列の性質の違いについて説明します。 前回も説明したように、Java のジェネリックス型は不変である一方、配列は共</e>…
今回はジェネリックスの不変、共変、反変について書いてみた。 本当は Effective Java 「項目25:配列よりリストを使う」の予定だったんだけど、不変、共変、反変あたりの話がでてきて、 ここらへんは以前からまとめておきたかったし、ちょうどよいと思っ…
今回は「項目24:無検査警告を取り除く」。 ポイント 無検査警告は必ず取り除く 方法1:コードを変更して警告を取り除く 方法2:注意して @SuppressWarnigns アノテーションで警告を抑制する ジェネリックスに対するコンパイル警告 ジェネリックスを利用…
第5章から Effective Java シリーズ再開。第5章はジェネリックスについて。 今回は「項目23:新たなコードで原型を使用しない」。 ポイント ジェネリックスを積極的に使う 実行時ではなくコンパイル時にエラーをチェックできる 原型は利用しない 非境界…
ここ最近、『Java の理論と実践』を読んだ時のメモをブログにアップしてきた。 concurrent 関連の記事は一通り読み終わったのでここらで一旦終了にしようと思う。 自分のために一通りをまとめておく。 メモ一覧 『Javaの理論と実践: 安全な構築のテクニック…
記事: Javaの理論と実践: volatile を扱う メモ: Java の言語としての同期化機構 synchronized volatile volatile volatile はsynchronized の軽量版 volatile は synchronized より実行時のオーバーヘッドが少ない ただし、synchronized を使ってできるこ…
記事: Javaの理論と実践: ノンブロッキング・アルゴリズムの紹介 メモ: Java5 でノンブロッキングアルゴリズムの開発が可能になった ノンブロッキングカウンター Atomic 変数を使ったカウンター アトミックで行く の内容とほぼ同じなので省略 ノンブロッキ…
記事:Javaの理論と実践: アトミックで行く メモ: JDK 5.0 でアトミック変数が追加された wait-free, lock-free なアルゴリズムが利用可能になった 以前は native code を使う必要があった スレッドの協調 マルチスレッド環境ではスレッド間の協調が必要 ロ…
記事:Javaの理論と実践: JDK 5.0における、より柔軟でスケーラブルなロック メモ: synchronized の特性 原子性(atomicity)と可視性(visibility)を提供 原子性:モニタオブジェクトに保護されたコードを実行できるのは一度に一つだけ 可視性:同じモニ…
数年前、「long と double は JVM 実装によっては二つの 32bit 値として扱うことがあるので、volatile 修飾子では atomic 性を確保できない。synchronized を使わないとスレッドセーフにならない」という話になったことがある。 最近、『Java の理論と実践』…
記事: Javaの理論と実践: Javaメモリ・モデルを修正する 第2回 メモ: 可視性の問題 すぐに他のスレッドの変更が見えるとは限らない これを保証するのがメモリモデル volatile, synchronized, final のメモリセマンティクスを決定している 同期化ブロックと…
記事: Javaの理論と実践: Javaメモリ・モデルを修正する 第1回 メモ: Java Memory Model の重要性 C/C++ はメモリモデルがなく、アーキテクチャ依存なので他のアーキテクチャでは並行プログラムが動作しない可能性がある Java なら Java がメモリモデルを…
スレッド・セーフの特性について 記事: https://www.ibm.com/developerworks/jp/java/library/j-jtp09263/ メモ: スレッドセーフは「all or nothing」の命題ではない クラスの保証するスレッドセーフ性を厳密に文書化するべきである インスタンスメソッド…
優れたHashMapの構築 記事: Javaの理論と実践: 優れたHashMapの構築 メモ: CuncurrentHashMap の実装を見てみる スループットが最適化されている 複数の書き込みロック。ハッシュバケットに対する 32 のロックコレクション。 size() や isEmpty() について…
並行コレクション・クラス 記事: Javaの理論と実践: 並行コレクション・クラス メモ: Doug Lea 氏の util.concurrent がいけてる Map の歴史 Hashtable: JDK 1.0 登場。同期化された Map。同期化が必要ない場合に遅い。 HashMap と Collections.synchroniz…
(若干) シンプルになった並行性 記事:Javaの理論と実践: (若干) シンプルになった並行性 メモ: ロギング・スケジューリング・キャッシング系のパッケージは再発明されやすい XML パーサ、XSLプロセッサー、PDF ジェネレータは再発明されないのに。。。 「…
ファイナル・アンサー? 記事: Javaの理論と実践: ファイナル・アンサー? メモ: 様々な final クラスの final:継承禁止 メソッドの final:オーバーライド禁止 フィールドの final:コンストラクタで一度だけ代入可能。その後、変更不可。 Java でクラス…
Javaの理論と実践: スレッドはどこへ消えた? 記事:Javaの理論と実践: スレッドはどこへ消えた? メモ: スレッドがスタックトレースを残さず消える場合がある 単一スレッド環境:例外が発生してコンソールにスタックトレースが出力される マルチスレッド環…
スレッド・プールとワーク・キュー 記事:Javaの理論と実践: スレッド・プールとワーク・キュー メモ: サーバーアプリケーションは「処理時間の短いタスク・大量のタスク」を処理することが多い これに対して、スレッドを都度立ち上げるというマルチスレッ…
クラスの中に定義されたクラスを『ネストしたクラス』と呼ぶ。 ネストしたクラスは4種類に分類できるが、非 static メンバークラスよりも static メンバークラスを利用するべき。 ネストしたクラス ネストしたクラスには以下の4種類があり、static のメン…
戦略パターンを実現するため、関数オブジェクトを利用する。 関数オブジェクト 多くのプログラミング言語では、関数ポインタ、委譲、ラムダ式と呼ばれるような機構を利用して、関数自体の受け渡しが可能になっている。 関数自体をある関数に与えることで、呼…
最近、再び Java の勉強に時間を使い始めた。 ずいぶんと昔に書かれたものだが Brian Goetz 氏が書いてるシリーズが勉強になりそうなので、毎日 30 分くらいで読んでいる。 IBM developerWorks 日本語版 : Java Technology : 技術文書一覧 今のところ、concu…
クラスが2つ以上の特性を持っている場合、タグフィールドを保持するよりも、クラス階層を利用するべき。 タグ付クラス タグ付クラスとはクラスが2つ以上の特性を持っていて、タグフィールドを保持することで、それらを区別するように実装されているクラス…
ちょっと前に android.widget.Button(以下、Button クラス)に最小幅を設定しようとして、ちょっとつまづいた。 問題 Button クラスに対して xml 側で最小幅を設定しているところがあった。 (指定が px 単位なのは分かりやすくするため) <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" android:minWidth="30px" /> これを、ちょっ</button>…
インタフェースは、その実装クラスのインスタンスで何ができるかだけを述べるべきである。 その他の目的、たとえば定数インタフェースなどには利用しない。 定数インタフェース メソッドを持たず、static final の定数を外部に提供しているだけのインタフェ…
Java では抽象クラスよりも、インタフェースを利用するべき。 抽象クラスとインタフェース 抽象クラスとインタフェースには以下の違いがある。 抽象クラスはメソッドの実装を含むことが許されるが、インタフェースは許されない 抽象クラスを実装するためには…
項目7でファイナライザの挙動を調べてて、以下の記事を見つけた。 IBM developerWorks ヒント: ファイナライザーによる脆弱性からコードを保護する どうやら Java のファイナライザには脆弱性があるらしい。 ファイナライザの脆弱性 項目7で書いたように、…