メソッドには 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 のシグネチャが使えるのは、
クラスのインスタンスを作成するときに、インスタンスにおける引数をコピーして、引数に使われたものが変わったとしても普遍的に使えるようにする。
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 を用いる方が望ましい。
参考。
オーバーロードは注意して使う必要がある。
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つにすることが推奨である。上記の記載方法では、見ている側が混乱することになる。同じようなことを書きたいのであれば、メソッドの名前を変える、という感じで対処すれば問題ない。
メソッドに複数の引数を渡す方法は以下の通りである。
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
}
確実に必要となる引数は前においておくことで、迷わずにメソッドを実行できるようになる。