2019/02/06
今回は、ゲッターの相方的なセッターについて説明したいと思います。
前回に続いて、お馴染みのHumanクラスをいじります。
Human.java
public class Human{ private static int count_Human = 0; String name; int birthday; int manpukudo; Human(String name, int birthday, int manpukudo){ // コンストラクタ1 this.name = name; this.birthday = birthday; this.manpukudo = manpukudo; count_Human++; } Human(String name, int birthday){ // コンストラクタ2 this(name, birthday, 50); } Human(){ // コンストラクタ3 this("不明", 0, 50); } public static int getCount_Human(){ return count_Human; } void eat(){ this.manpukudo += 60; } }
御覧のように、このHumanクラスには4つのフィールド(メンバ変数)があります。以下の4つです。
private static int count_Human = 0;
String name;
int birthday;
int manpukudo;
前回はこのうち、count_Human(Humanオブジェクトが作られた数を表すint型変数)をprivateにして、その値を取得する為のゲッターを作りました。
sponsored link
ゲッターのおさらい
カプセル化という概念を完全に理解するのは大変だと思いますが、フィールドは全てprivateにしてしまうカプセル化の大原則です。フィールドをprivateにすると、他のクラスからそのフィールドにアクセスすることができなくなります。
例えば、Humanクラスのインスタンスフィールドであるnameを以下のようにprivateにすると、
Human.java
public class Human{
private static int count_Human = 0;
private String name;
int birthday;
int manpukudo;
// 以下省略
}
他のクラスから、
Human human1 = new Human();
human1.name = "ノブオ";
こういう風に、アクセスすることができなくなります。値をいじるのはもちろん、以下のようにその値を取得するだけでもダメです(コンパイルエラーになります)。
Human human1 = new Human();
human1.name = "ノブオ";
System.out.println(human1.name);
一切触れないのではそのフィールドを利用することができないので、その値を取得するためのメソッドをHumanクラス内に作ります。
Human.java
public class Human{
private static int count_Human = 0;
private String name;
int birthday;
int manpukudo;
// コンストラクタ省略
public String getName(){
return this.name;
}
}
取得したいフィールドの値をreturnするだけの単純なメソッドです。このメソッドは他のクラスから呼び出せるようにpublicにしておく必要があります。このようなprivateなフィールドの値を取得するためのメソッドをゲッターと呼ぶんでした。(参考:オブジェクトって何? 〔アクセス修飾子とは〕 〔ゲッターとは〕)
ゲッターを他のクラスから呼ぶことで戻り値としてそのprivateなフィールドの値をゲットするわけです。
Human human1 = new Human();
System.out.println(human1.getName());
こんな感じです。
セッターとは
ゲッターを利用することで、privateなフィールドの値をゲットできるようになりました。しかし、ゲッターはその名の通りフィールドの値をゲットするだけです。そのフィールドの値を書き換えることはできません。
今度はprivateなフィールドを書き換えるためのメソッド、セッターを作ります。
セッターを作る前に、まずセッターをどんな風に使うかを説明します。例えば、1977年1月1日生まれの「ノブオ」という名前のオブジェクトを作って、
HumanTest.java
public class HumanTest{
public static void main(String[] args){
Human human1 = new Human("ノブオ",19770101);
}
}
「ノブオ」を「ノブ」に改名するとします。つまり、human1のインスタンスフィールドnameの値を「ノブオ」から「ノブ」に書き換えます。
HumanTest.java
public class HumanTest{
public static void main(String[] args){
Human human1 = new Human("ノブオ",19770101);
human1.setName("ノブ");
}
}
このように、setName()の引数にセットしたい値を放り込むわけです(「set」と「get」を見間違わないように注意)。
セッターの名前は、「set + 書き換えたいフィールド名(頭文字は大文字)」とするのが普通です。とは言っても、ただのメソッド名なのでどんな名前でも大丈夫です。とは言っても、メソッド名を見ることで、そのメソッドの役割が分かるようにしておくのは重要なことです。
では、上記のように引数を受け取ってその値をフィールドにぶち込むセッターをHumanクラスのpublicなメンバとして作りましょう。(あえて先に使い方を説明しましたが、もちろん定義するからこそ使えます。)
Human.java
public class Human{ private static int count_Human = 0; private String name; int birthday; int manpukudo; // コンストラクタ省略 public String getName(){ return this.name; } public void setName(String name){ this.name = name; } }
( )の中に仮引数を宣言してString型の値を受け取れるようにしています。そして、その受け取った値を、自身のインスタンスフィールドのname(this.name)に代入しています。これがセッターです。
セッターの応用
ゲッターは単純にそのフィールドの値を取得するメソッド(にするべき)ですが、セッターは受け取った値を単純にフィールドに放り込むだけじゃなく、工夫次第でいろんな使い方ができます。
どんな工夫をするかと言うと、受け取った値が不正な値ではないかをチェックさせる機能をセッターに持たせるんです。
例えば、「名前」は10文字以内というルールを設定したとしましょう。上述のsetNameメソッド(セッター)は、引数に受け取ったStringをインスタンスフィールドであるnameに放り込むメソッドですが、受け取ったStringが10文字を超えた場合はフィールドに放り込まずにエラーメッセージが出るようにします。
Human.java
public class Human{
// 関係ないところは省略してます
private String name;
public void setName(String name){
if(name.length() <= 10){
System.out.println(this.name + "を" + name + "に変更しました");
this.name = name;
}else{
System.out.println("名前は10文字までにしてください");
}
}
}
ちなみに、length()というのは、Stringクラスのインスタンスメソッドで、そのStringインスタンスが保持する文字列の文字数を返します。つまり、name.length()で、nameが保持する文字列の文字数を返します(nameが”ノブオ”なら3になります)。
Stringのことがよく分からない人はこちらをどうぞ→そもそもStringって何?
ちょっと脱線しましたが、要はsetNameメソッドに、引数に受け取った文字列が10文字以内かどうかをチェックする機能を付け加えたわけです。実際、使ってみましょう。
HumanTest.java
public class HumanTest{ public static void main(String[] args){ Human human1 = new Human("ノブオ",19770101); human1.setName("アヤノコウジ ノブゴロウ"); human1.setName("ノブ"); System.out.println(human1.getName()); } }
これで実行すると、こうなりますね。↓
このように、セッターというのは、引数に与えられた値をそのままフィールドに代入するだけではなく、その値が正しい値かどうか?つまりその値をフィールドに代入することで何か不具合が起きたりバグの原因になったりしないかをチェックする機能を持たせることも可能です。
eclipseにおけるゲッター・セッターの簡単な作り方
eclipseには、ゲッターとセッターを一発で作ってくれる機能がついています。ただ単にフィールドの値を取得するメソッドと、ただ単にフィールドに値を放り込むメソッドを全フィールド分書くのって結構、面倒くさいです。そんな時はこの機能を使いましょう。
ゲッター・セッターを作りたいクラスを開いた状態で、左上の「ソース」というのを選択します。すると、
その中に、「getterおよびsetterの生成」っていうのがあるので、クリック。するとこんなウィンドウが立ち上がります。
『作成するgetterおよびsetterの選択』というところに、そのクラスが持つフィールドがズラッと出てくるので、ゲッターもセッターも両方作りたい場合は、その横のチェックボックスにチェックをいれます。もし、ゲッターだけとかセッターだけでいいという場合は、フィールド名の左にある三角をクリックするとゲッターとセッターを個別に選択できるチェックボックスが出てくるので必要な方をチェック。
その下の『挿入ポイント』というのは、作成したゲッターやセッターをソースのどこに挿入するかを選択できます。
その下の『ソート順』というのは、作成したゲッターやセッターの書く順番です。
『アクセス修飾子』は普通はpublicでいいです。
『メソッド・コメント』はどうでもいいです。
こんな風に必要な個所にチェックを入れたりしてOKをクリックするだけで、ズラッと数十行(フィールドの数が多いクラスなら数百行?)に渡るゲッターとセッターの数々を一瞬で書いてくれます。非常に便利ですのでぜひ使ってみて下さい。
ゲッターとセッターとはどういうものかが分かったところで、次回はオブジェクト指向の三大要素の一つ「カプセル化」について説明します。
今だけ→転職できなければ全額返金の「エンジニア転職保証コース」
絶対エンジニアになる!→テックエキスパート
フリーランスエンジニアの収入例を見てみる→レバテックフリーランス
コメント
[…] 参考サイト: ・NetBeans PHPでgetter、setterを自動生成する ・getter/setterとはなんだったのか ・セッターって何? […]
by NetBeansコードの編集や生成 | FuelPHP | GARA DØCs Wёb 2014/12/18 08:30
これで実行すると、こうなりますね。↓
なりません
初心者は心細いので、画面上のプログラムをそっくりそのまま撃ちこめば
これで実行すると、こうなりますね。↓
となるようにしたいわけです。そしていろいろいじってみて、どうなるのかを確かめたい。
by 匿名 2019/08/26 23:38
[…] 【Java】 セッターって何? […]
by gradle run | eclipseブログ 2019/09/13 19:04
初心者です。分かってなくて申し訳ないんですが、前の回もありましたが結局、関係ないところを省略したコードでコンパイル出来なかったというのは省略した所が関係している、ということですよね?
by 匿名 2020/06/17 20:02