arveltのソフトウェア技術メモ

Arvelt's software technology memo

Java言語基礎編 ―パーフェクトJavaを読んで―

http://gihyo.jp/book/2009/978-4-7741-3990-6

技術評論社のパーフェクトJavaで勉強中。
読んで初めて知ったり、これはおさえとかねばー的な部分の備忘録。
頭に(要サンプル)とつけたのは、実際コード書かなくちゃわからないなと思ったところ。


ちなみに今まで仕事でこのへんの知識を必要とされたことはほとんどなかった。業務アプリケーションってそんなもの。そして私はそういうのから抜け出したいと頑張るのである。


Prat01Java言語


○変数、演算子、修飾子について
・基本型のbyte、char、short、int、longの最大値、最小値
・short、int、longの使い分けは、「どれでもいいならintを使う」。
・Andとorのベン図をイメージできているか。ド・モルガンの法則のベン図はどうか。
・static、final修飾子がつくとどうなるか。
・参照型の変数の値は「オブジェクトへの参照」であるということの意味について。finalするとどうなるか。
・public、protected、修飾子なし、private、のスコープ範囲の違いについて。(変数、クラスともに)
・==演算子は同一性を評価する。同一性は、2つのオブジェクト参照が同一のオブジェクトを参照しているかの判定。eqaulsメソッドは同値性を評価する。同値性は、2つのオブジェクト参照が(オブジェクトで定義されている)同じ値を持つかどうかの判定。
・1==1 はtrue、"ABC"=="ABC"はfalse(となる方が多い)、"ABC".equals("ABC")はtrue
・&&と||演算子は左のオペランド式の評価が偽であれば、右のオペランド式を評価しない。
・3項演算子はif-elseを使った等価な式に書き換えることができる。3項演算子は可読性を損なうため使用は推奨されない。
・if-elseではなくswitch文を使ったほうがよいパターンについて。
・数値ラッパークラスを使う場面。数値をオブジェクトとして扱いたいとき、コレクションの要素に数値を扱うとき。


Javaの定石
・Sun(Oracle)推奨のコーディング規約に一度でも目を通したか。
・引数が基本型の場合と参照型の場合での挙動の違いについて。
・オブジェクト初期化処理の順序について。ただし、それに依存したコードを書いてはならない。
・継承時のオブジェクトの初期化処理について。
・乱数に対して10の剰余を計算し、3より小さいとき、という条件式で30%の発生確率を実現できる。


○クラス
Javaではいうオブジェクトは、「クラスのインスタンス」のことである。
・オブジェクトの振る舞いをインターフェースで、オブジェクトの実装をクラスで表現する。
・インターフェースと継承の使い分け。継承は、実装の継承のために使う。インターフェースは振る舞いの継承のために使う。
・オーバーライドできるメソッドの条件について。
・(要サンプル)メソッド呼び出しか、コールバックパターンか。変わりにくい部分に依存するように選ぶ。
・(要サンプル)クラスをネストした場合のスコープの範囲の違いについて。
・クラス設計の指針、アプリケーションクラス分割の一例について。
・import時には、標準ライブラリの型名と同名を避ける。オンデマンドインポート(*)を避ける。
・不変型の実装方法について。


○コレクション
・(要サンプル)コレクションクラスにおける、インターフェースと具象クラスの分割について。Set、List、Deque、Mapのインターフェース。ハッシュテーブル、配列、ツリー、リンクリスト、リンクハッシュテーブルの実装。
・指針。要素を舐める処理、要素を書き換える処理などはArrayListを使う。要素の挿入や削除の頻度が高い場合はLikedListを使う。
・(要サンプル)コレクションのコピー時に、要素だけをコピーすることをshallow copy、要素と参照先のオブジェクトを一緒にコピーすることをdeep copyという。


○例外、ストリーム、スレッド、同期処理
・例外の指針について。1、Exception、RutimeExceptionを直接使わない。2、アプリケーション例外はExceptionのサブクラスで検査例外として定義する。3、実行時例外は標準ライブラリを使用する。4、Errorのサブクラスを作らない。
・(要サンプル)独自の例外クラスを作る場合の定石について。
・(要サンプル)ファイルストリームのバッファリング。ディレクトリとフィルタリングについて。
・(要サンプル)Javaにおけるソケットプログラミング、タイムアウト処理、ノンブロッキングモード、HTTPクライアントの基本。
・ThreadクラスとRunnableインターフェースの関係。
・synchronized修飾子と、syncronized文の使い方。スレッドをいかにして生成するかではなく、複数のスレッドから呼び出されても問題ないコードをいかにして書くか、に注力する。


パーフェクトJava (PERFECT SERIES) (PERFECT SERIES 2)

パーフェクトJava (PERFECT SERIES) (PERFECT SERIES 2)