Effective Java 7
By:2022-04-06T17:00:00.000Z
    目次

はじめに

  • Effective Java を読んでよかった場所を抜粋して記載

項目 49 パラメータの正当性を検査する

メソッドには Documentation を記載しておく。return されるものや引数やエラーの類など。

あまり大したことが記載されていない章だが、覚えて損はないものがあった

Objects.requireNonNull(huga);if(huga == null) throw new NullPointerException();
this.huga = huga;

//中身
public static <T> T requireNonNull(T obj) {
    if (obj == null)
        throw new NullPointerException();
    return obj;
}

は等価である。なので、わざわざ null の条件を記載する必要はなく、中身も非常にシンプル。static でも T のシグネチャが使えるのは、で型を推定させる宣言を行い後ろの T で返る値を決定しているため。

項目 50 必要な場合、防御的にコピーする。

クラスのインスタンスを作成するときに、インスタンスにおける引数をコピーして、引数に使われたものが変わったとしても普遍的に使えるようにする。

public class Period {
    Date start;
    Date end;
    public Period(Date start, Date end) {
        this.start = new Date(start.getTime());
        this.end = new Date(end.getTime())
    }
}

Date start = new Date();
Date end = new Date()
Period period = new Period(start,end);
start.set(11);

という形にする。start.set(11)が実行されたとしても period の中身は普遍な値となる。 ちなみに、Date 関連は使うことが推奨されておらず、LocalDateTime か ZonedDateTime を用いる方が望ましい。 参考

項目 52 オーバーロードを注意して使う

オーバーロードは注意して使う必要がある。

public class CollectionClassifier {
    public static String classify(Set<?> s) {
        return "set";
    }
    public static String classify(List<?> s) {
        return "list";
    }
    public static String classify(Collection<?> s) {
        return "collection";
    }
}

このうちどれが実行されるか、ということについて記載されている。選択はコンパイル時に行われているらしく、このやり方では一番下の Collection が期待されるメソッドとなる。 オーバーロードの記載方法として正しいのは、引数が同じになるメソッドは1つにすることが推奨である。上記の記載方法では、見ている側が混乱することになる。同じようなことを書きたいのであれば、メソッドの名前を変える、という感じで対処すれば問題ない。

項目 53 可変長引数を注意して使う

メソッドに複数の引数を渡す方法は以下の通りである。

static int min(int... args) {
    if (args.length == 0) throw new IllegalArgumentException("too few arguments. need 1 length");
    int minValue = args[0];
    for(int i = 1; i < args.length; i++) if(args[i] < minValue) minValue = args[i]
    return minValue
}

という感じで、可変長引数は記載できる。ただし、引数が一個以上必要なのをわざわざ throw であげるのは不恰好である。そういう時は以下のようにかく

static int min(int firstArgs, int... args) {
    int minValue = firstArgs;
    for(int i = 1; i < args.length; i++) if(args[i] < minValue) minValue = args[i]
    return minValue
}

確実に必要となる引数は前においておくことで、迷わずにメソッドを実行できるようになる。

プロフィール
Kobasan
現在都内のWeb会社で働いている人です.主にこれまで,Web関連及び機械学習周りのことをやってきました.このブログではそれらの内容を含む,ちょっとした私の備忘録を記載するものです.