一番かんたんなJava入門

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

Home » 一番かんたんな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の値を「ノブオ」から「ノブ」に書き換えます。

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());
        }
}

 これで実行すると、こうなりますね。↓

setname

 このように、セッターというのは、引数に与えられた値をそのままフィールドに代入するだけではなく、その値が正しい値かどうか?つまりその値をフィールドに代入することで何か不具合が起きたりバグの原因になったりしないかをチェックする機能を持たせることも可能です。

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

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

 ゲッター・セッターを作りたいクラスを開いた状態で、左上の「ソース」というのを選択します。すると、

setter

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

setter2

 『作成するgetterおよびsetterの選択』というところに、そのクラスが持つフィールドがズラッと出てくるので、ゲッターもセッターも両方作りたい場合は、その横のチェックボックスにチェックをいれます。もし、ゲッターだけとかセッターだけでいいという場合は、フィールド名の左にある三角をクリックするとゲッターとセッターを個別に選択できるチェックボックスが出てくるので必要な方をチェック。

 その下の『挿入ポイント』というのは、作成したゲッターやセッターをソースのどこに挿入するかを選択できます。

 その下の『ソート順』というのは、作成したゲッターやセッターの書く順番です。

 『アクセス修飾子』は普通はpublicでいいです。

 『メソッド・コメント』はどうでもいいです。

 こんな風に必要な個所にチェックを入れたりしてOKをクリックするだけで、ズラッと数十行(フィールドの数が多いクラスなら数百行?)に渡るゲッターとセッターの数々を一瞬で書いてくれます。非常に便利ですのでぜひ使ってみて下さい。

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

今だけ→転職できなければ全額返金の「エンジニア転職保証コース」
絶対エンジニアになる!→テックエキスパート

フリーランスエンジニアの収入例を見てみる→レバテックフリーランス

全くの初心者がWordPressでブログを始める方法

全くの初心者がWordPressでブログを始める方法

sponsored link

Androidアプリを作ろう

コメント

  • […] 参考サイト: ・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

down

コメントする



一番かんたんなJava入門

Androidアプリの作り方

忘備録

私の作ったAndroidアプリ

おすすめプログラミングスクール

プログラミングスクール検索

受講スタイル

習得したいスキル

習得したい言語・フレームワーク

オプション

料金

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

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

管理人

Nobuo_CREATE

Nobuo_CREATE

WordPressテーマPrinciple、マテリアルを作ったり、Androidアプリを作ったり、Java入門サイトを作ったり、本を書いたりしています。大阪の北野田駅近くのマイスタイルという学習塾を経営しています。どうぞよろしく。 [詳細]



sponsored link

オススメ書籍

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

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

只今、急拡大中

JavaからのRuby on Rails入門

JavaからのRuby on Rails入門