JavaのBest Practice


JavaのBest Practiceについてのまとめです。

😀 前提条件、入力のチェック

実行時の前提条件、入力のチェックを行うことはよい作法です。

class AsyncFileReader {
void readLater(File file, Closure<String> callback) {
checkNotNull(file);
checkArgument(file.exists() && file.canRead(), "File must exist and be readable.");
checkNotNull(callback);
scheduledExecutor.schedule(new Runnable() {
@Override public void run() {
callback.execute(readSync(file));
}
}, 1L, TimeUnit.HOURS);
}
}

🐞 アクセス制御はできるだけ小さく保つ

アクセス制御は最低限にして、コールする側が意図した使い方をするように心かげましょう。
これはスレッドセーフなコードを書くためにも不可欠です。

// フィールドやメソッドの公開は必要最低限に
// クラスもpackage-privateを心がけ、できるだけ直接アクセスを避ける
class Parser {
private final Map <String, String> rawFields;
private String readConfigLine() { /* .. */ }
}

🐯 イミュータブルを心がける

できるだけイミュータブルなオブジェクトにして、意図しない変更が発生しない安全なコードを書きましょう。

public class User {
private final Date birthday;
private final Map<String, String> attributes = Map.newHashMap();
public Map<String, String> getAttributes() {
return ImmutableMap.copyOf(attributes);
}
@Nullable
public String getAttribute(String attributeName) {
return attributes.get(attributeName);
}
}

🗽 一般化された型を使う

できるだけ一般化されたタイプを使うことで実装の詳細に影響を受けないAPIを作ることができます。

// - Iterable defines the minimal functionality required of the return.
interface Database {
Iterable<User> fetchUsers(String query); // ArrayList => Iterable など
}

🍣 最低限の例外のキャッチを行う

catchを使う場合はできるだけキャッチする例外を狭めることで、予期しない動作を防ぐことができます。

interface DataStore {
String fetchValue(String key) throws StorageException;
static class StorageException extends Exception { /* ... */ }
}
try {
String value = storage.fetchValue(key);
} catch (StorageException e) {
LOG.error(Failed to fetch value from storage.);
}

🐡 デメテルの法則に従う

デメテルの法則(Law of Demeter, LoD)は自分以外の構造やプロパティに対して持っている家庭を最小限にすべきという考え方です。

class Weigher {
private final double defaultInitialRate;
Weigher(WeightingService weightingService, double defaultInitialRate) {
this.defaultInitialRate = validateRate(defaultInitialRate);
this.weightingService = checkNotNull(weightingService);
}
}

🎳 参考リンク

📚 おすすめの書籍

🖥 サーバについて

このブログでは「Cloud Garage」さんのDev Assist Program(開発者向けインスタンス無償提供制度)でお借りしたサーバで技術検証しています。 Dev Assist Programは、開発者や開発コミュニティ、スタートアップ企業の方が1GBメモリのインスタンス3台を1年間無料で借りれる心強い制度です!(有償でも1,480円/月と格安)