一番かんたんなJava入門

これからJavaを始めようという人の為の超入門サイトです。丁寧、簡単にこだわった解説なので初心者にぴったりです。

【Java】 セッターって何?

time 2013/07/19

 今回は、ゲッターの相方的なセッターについて説明したいと思います。
 前回に続いて、お馴染みの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を「”ノブ”」に書き換えたいわけです。nameはprivateなので、

HumanTest.java

public class HumanTest{
	public static void main(String[] args){
                Human human1 = new Human("ノブオ",19770101);

                human1.name = "ノブ";
        }
}

↑これはできません。しつこいようですが、privateなフィールドを他のクラスから直接書き換えることはできないのです。そこで、セッターをこんな風に使います。

HumanTest.java

public class HumanTest{
	public static void main(String[] args){
                Human human1 = new Human("ノブオ",19770101);

                human1.setName("ノブ");
        }
}

 このように、setName()の引数にセットしたい値を放り込むわけです(「set」と「get」は似ているので見間違わないように注意)。セッターの名前は、「set」+ 書き換えたいフィールド名(頭文字は大文字)とするのが普通です。とは言っても、ただのメソッド名なのでどんな名前でも大丈夫です。とは言っても、メソッド名を見ることで、どのフィールドのセッターなのかが分かるようにしておくのは重要なことですし、例えば「changeName()」なんて言う名前にしたい気持ちも分かりますが、単純にフィールド値を書き換えるメソッドならば、セッターらしく「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)を、インスタンスフィールドの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());
        }
}

 これで実行すると、こうなりますね。↓
setname
 このように、セッターというのは、引数に与えられた値をそのままフィールドに代入するのではなく、その値が正しい値かどうか?つまりその値をフィールドに代入することで何か不具合が起きたりバグの原因になったりしないかをチェックしてから代入するような設計にすることができるんです。

eclipseにおけるゲッター・セッターの簡単な作り方

 eclipseには、ゲッターとセッターを一発で作ってくれる機能がついています。ただ単にフィールドの値を取得するメソッドと、ただ単にフィールドに値を放り込むメソッドを全フィールド分書くのって結構、面倒くさいです。そんな時はこの機能を使いましょう。
 ゲッター・セッターを作りたいクラスを開いた状態で、左上の「ソース」というのを選択します。すると、

setter

その中に、「getterおよびsetterの生成」っていうのがあるので、クリック。するとこんなウィンドウが立ち上がります。

setter2

 『作成するgetterおよびsetterの選択』というところに、そのクラスが持つフィールドがズラッと出てくるので、ゲッターもセッターも両方作りたい場合は、その横のチェックボックスにチェックをいれます。もし、ゲッターだけとかセッターだけでいいという場合は、フィールド名の左にある三角をクリックするとゲッターとセッターを個別に選択できるチェックボックスが出てくるので必要な方をチェック。
 その下の『挿入ポイント』というのは、作成したゲッターやセッターをソースのどこに挿入するかを選択できます。
 その下の『ソート順』というのは、作成したゲッターやセッターの書く順番です。
 『アクセス修飾子』は普通はpublicでいいと思います。
 『メソッド・コメント』はどうでもいいです。
 こんな風に必要な個所にチェックを入れたりしてOKをクリックするだけで、ズラッと数十行(フィールドの数が多いクラスなら数百行?)に渡るゲッターとセッターの数々を一瞬で書いてくれます。非常に便利ですのでぜひ使ってみて下さい。

 ゲッターとセッターとはどういうものかが分かったところで、次回はオブジェクト指向の三大要素の一つ「カプセル化」とはどういうことなのかについて説明します。

sponsored link

Androidアプリを作ろう

コメント

down

コメントする



CAPTCHA


一番かんたんなJava入門

Androidアプリの作り方

忘備録

私の作ったAndroidアプリ

私の作ったWordPressテーマ

プロに教わるオンライン学習

管理人

Nobuo_CREATE

Nobuo_CREATE

WordPressテーマPrinciple、マテリアルを作ったり、Androidアプリを作ったり、Java入門サイトを作ったり、本を書いたりしています。どうぞよろしく。 [詳細]



sponsored link

オススメ書籍

[オススメpoint]

 この本は全く何も分からない初心者の方にお勧めです。プログラミングをするには覚えなければならない事が無茶苦茶いっぱいありますが、この本は教えてくれる順番、その構成が素晴らしいです。RPGのゲームを作るというストーリーにのっとってちょっとずつ難しいことを教えてもらえます。
 無機質で膨大なデータが載っているような本は読む気にならないという方は、こういうストーリー仕立ての本でチャレンジしてみてはいかがでしょうか?(注:RPGを作る為の本ではありません。)

[オススメpoint]

 ある程度、Javaを読み書きできるようになったら、オブジェクト指向について学ぶべきです。本書は、抽象的で分かったような分からんようなオブジェクト指向について、非常に分かりやすい例を出して説明してくれています。オブジェクト指向とは何なのか?という本質を掴むのにこれほど適した本はないと思います。オブジェクト志向の理念を理解できれば、より効率のいいコードをより楽に書けるようになるはずです。Java上級者を目指すなら必読の一冊!

只今、急拡大中

ゲームを作りたい人専門

個人フットサル予約サイト

ガチ専門

JavaからのRuby on Rails入門

JavaからのRuby on Rails入門