フィールドの活用も「ソース」メニューで
例えば、いくつかのフィールドを用意して、必要なデータを保管するようなクラスを考えてみましょう。このクラスを、もっときちんと利用できるように修正してみることにします。
public class Sample {
int n = 0;
String msg = "";
}
こんな感じのものです。データを保持するクラスとしてこの種のものはよく作りますね。しかし、これでは、あまりに情けないクラス定義です。とりあえず、フィールドをprivateにして、アクセス用のメソッドを用意しましょう。
まず、2つのフィールドをprivateに変更しておきましょう。そしてクラス内の適当なところを選択し、<ソース><GetterおよびSetterの作成>メニューを選びます。現れたダイアログで、「作成するGetterおよびSetterの選択」で「msg」「n」の2つのフィールドをONに、そして「アクセス修飾子」を「public」に設定してOKしましょう。するとソースコードはこんな具合に修正されます。
public class Sample {
private int n = 0;
private String msg = "";
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public int getN() {
return n;
}
public void setN(int n) {
this.n = n;
}
}
あっという間に、それなりに整ったJavaBeansクラスになりました。更にもう一ひねりしましょう。<ソース><フィールドを使用してコンストラクタを作成>メニューを選び、2つのフィールドのチェックをONにしてOKします。すると、ソースコードはこうなります。
public class Sample {
private int n = 0;
private String msg = "";
public Sample(int n, String msg) {
super();
this.n = n;
this.msg = msg;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public int getN() {
return n;
}
public void setN(int n) {
this.n = n;
}
}
フィールドを初期化するためのコンストラクタが自動生成されました。ここまできたら、更にもう一歩。クラスの比較を正しく行なえるようにequalsとhashCodeメソッドを実装しましょう。<ソース><hashCode()およびequals()の生成>メニューを選び、2つのフィールドのチェックをONにしてOKします。するとソースコードは更にこんな具合になります。
public class Sample {
private int n = 0;
private String msg = "";
public Sample(int n, String msg) {
super();
this.n = n;
this.msg = msg;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public int getN() {
return n;
}
public void setN(int n) {
this.n = n;
}
@Override
public int hashCode() {
final int PRIME = 31;
int result = 1;
result = PRIME * result +
((msg == null) ? 0 : msg.hashCode());
result = PRIME * result + n;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final Sample other = (Sample) obj;
if (msg == null) {
if (other.msg != null)
return false;
} else if (!msg.equals(other.msg))
return false;
if (n != other.n)
return false;
return true;
}
}
hashCodeでは、2つのフィールドの値によってきちんと異なるハッシュ値が生成されるように作成されています。またequalsも、2つのフィールドがそれぞれ等しい値である場合にはtrueを、それ以外はfalseを返すようになっています。まさに、パーフェクト!ですね。
最初の「フィールドが2つあるだけ」のクラスと、この最終的に作られたクラスを比べてみてください。途中、ソースコードは一切書いていません。ただメニューを選ぶだけで、これだけしっかりしたソースコードが作成できてしまうのです。フィールドを活用したクラスでは、これらは必須といえそうですね。