Java
作成日時:2024-08-01以前
更新日時:2024-08-26
列挙型とファクトリー
値オブジェクトによる普遍性
関心事を纏めておけば修正箇所はわかりやすい
修正するとき何処を直せばいいかすぐわかるような。
リフレクションはキャッシュする
Math.ceil(1/2)が1にならない
1/2が0に評価されるから。
どちらかをdoubleにキャストする。
Enum
- values()で返却される配列は、定義順が保証されている。
- クラス名の末尾にEnumをつけない。単数形の名詞であること
- EnumSet, EnumMapを使え
Stream
- コレクションにnullが存在する状態で、findFirst()を呼ぶとNullPointerException
マルチスレッド
基本的にはFuture#getとCallableでスレッドの完了を待てばいいが、
各スレッドが終わった直後に何かをしたければ、CompletableFutureで
JavaScriptのPromiseみたいなことができる。
モジュール
Javaのモジュールに関して。
モジュールは下記の認識。
- モジュールとはパッケージの集合体である
- 公開するパッケージを表明できる
- 依存するパッケージを表明できる
- クラスパスとは異なるモジュールパスという概念がある
Javaプロジェクト内に下記のパッケージが存在するとする。
- com.example.a.util
- com.example.a.common
- org.example.b.util
- org.example.b.common
module com.example {
exports com.example.a.util,org.example.b.util
}
として単一のjarを生成した場合、
末尾utilのパッケージのみが外部から参照される認識
- パッケージ版デメテルの法則
- パッケージ版カプセル化
みたいに考えればよろし
requiresで本当に必要なモジュールを明示できる
それ以前は関係ないものを読み込んだりする可能性があった
でもmavenやgradleがあればあんまり恩恵はない
インターフェイス
- staticメソッドはファクトリとかUtilとか
- 単一責任原則的な
- defaultメソッドはtemplate method的に
Optionalでnull合体演算子
Optional.ofNullable(obj).orElse(default)
Gradle
Springを使わずに構築するのが久々だから、そこそこ詰まった。
Eclipseから作成すると、デフォでマルチプロジェクトになるよう変わっていた。
シングルプロジェクトが作りたかったので、下記の手法でプロジェクトを作成した。
導入からプロジェクト作成
- Gradle Build Toolからzipをダウンロード
- zipを解凍し、任意の場所に配置
- binフォルダにpathを通す。
gradle init
でプロジェクト作成。対話形式。- タイプは4のBasicを選ぶ
- 出来たプロジェクトをeclipseにインポート
Gradleの同期が終わらない
15%前後から進まなくなった。
設定 > Gradleから「ビルド・スキャン」のチェックを外す。
可視性
- protected:自身とサブクラスのみ。孫は含まない。
- なし:パッケージ内のみ。
ラムダ
forEachの中のラムダ式が検査例外出す奴だと、try-catchで囲まなければならないからめんどくさい。
これに限らず、いろいろとforの方がよい。
ラムダは単純なstream処理と、関数インターフェイスとかで使用すべき。
その他
- カプセル化 全て隠蔽
- コレクションメンバー変数もgetter準備せず、追加を外部に許可させるためadd関数作ったり。
- デメテルの法則
- Enumがない言語はクラスで代用すればいいじゃん。
コンストラクター隠蔽して内部に定数つくってさ。 - メッセージ引数は列挙型
- 野良IDを防ぐ
- ジェネリックメソッド
- BCrypt
Java secureRandom - BigInt