質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.75%

  • Java

    13119questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

[java]コンストラクタについて

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 179

SRisu

score 1

プログラミング初学者です。まだ始めたばかりなので、おかしなことを質問するかもしれません。
教科書を見ながら学んでいるのですが、そのコンストラクタを学ぶ項でのサンプルプログラムのメソッドsetResultの役割がよくわかりません。
メインクラスでも、getResultは呼び出しされているのにも関わらず、setResultはインスタンス化すらされておらず、一体何を行なっているものなのか分からず、質問させていただきました。
(もともとは給湯器があったとして、100度を超える値を入力すると100度として表示され、100度以下ならそのまま表示されるというプログラムでしたが、サンプルプログラムを丸々コピペするのは著作権的にどうなのかと思いSampleなどで代用しました。)

よろしくお願いいたします。

 該当のソースコード

public class Sample{

    private int number;

    public Sample(int number){
        this.number = cutResult(number);
    }

    public int getResult(){
        return this.number;
    }

    public void setResult(int number){
        this.number = cutResult(number);
    }

    private int cutResult(int number){
        if(number >= 100){
            return 100;
        }
        return number;
    }
}

class Main{
    public static void main(String[] args){

        Sample sample1 = new Sample(150);
        int result1 = sample1.getResult();
        System.out.println("設定値は" + result1 + "です。");

        Sample sample2 = new Sample(80);
        int result2 = sample2.getResult();
        System.out.println("設定値は" + result2 + "です。");
    }
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+5

getResultは呼び出しされているのにも関わらず、setResultはインスタンス化すらされておらず

呼び出されていないのはたまたまです。
給湯器の温度を途中で変更するようなサンプルコードでないだけです。

(なお、この場面で『インスタンス化』という言葉はちょっと変です。)

もしセッターが無かったら

一体何を行なっているものなのか分からず、質問させていただきました。

質問に記載されている、まさに次の役割です。
『100度を超える値を入力すると100度として表示され、100度以下ならそのまま表示される』

setResult(1000)を呼び出すとします。温度を千度にしろ!という、とんでもない指令です。
ここでもしセッターを次のように実装していたら... 要求が通ってしまいます。

public void setResult(int number) {
    this.number = number;  // そのまま代入しちゃう
}

しかし、サンプルコードでは次のように組まれています。

public void setResult(int number){
    this.number = cutResult(number);
}

private int cutResult(int number){
    if(number >= 100){
        return 100;
    }
    return number;
}

cutResultが100度以上の温度は弾いてくれるので、少なくとも千度にはなりません。安心です。
(低い方にはいくらでも設定できるのは欠陥に見えますが...)

セッターを用いることによって、値をセットする際に処理を噛ませているのです。

なお

個人的には、Sampleクラスのコンストラクタは次のように書いた方が良いと思います。

public Sample(int number){
    setResult(number);
}

『値をセットするときに留意すべきことがある』という事実を完全に忘れられるからです。
コードに期待する動作に依ってはこの限りではありませんが。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/15 02:08

    回答ありがとうございます。
    大変見やすく分かりやすいです。
    コンストラクタ内にsetResultと同じような記述があったので混同してしまっていたようです。
    (コンストラクタの役割がハッキリとわかっていないせいでもあるのですが)

    キャンセル

  • 2018/05/15 08:21

    改めてコンストラクタを仰る通りにして考えてみたら、納得できました!ありがとうございます!

    キャンセル

+2

初心者タグが付いてるので、本題と逸れますが指摘します。

1,クラス名はSampleではなく、具体的なモノを表す方が後で(3ヶ月後にコード読んだ時)に後悔しずらいかと。
今回の場合は給湯器なのでクラス名はSampleではなくPotクラス。

2,メソッド名や引数も同様です。
setResultではなくsetTemperature、変数名もnumberではなくtemperature

3,個人的な好みとしてはcutResultメソッドは作らずにMath.minを使って最大値の設定をします。

サンプルコードです、ご参考まで→Wandbox

class Pot{
    private int temperature;
    private static final int BOILING_POINT = 100;
    public Pot(int temperature){
        setTemperature(temperature);
    }
    public int getTemperature(){
        return this.temperature;
    }
    public void setTemperature(int temperature){
        this.temperature= Math.min(temperature, BOILING_POINT);
    }
}
class Wandbox
{
    public static void main(String[] args){
        // 以下の変数 sample1, result1 も同様に適切な名前に変更すると後で見直した時に後悔しないです。
        Pot sample1 = new Pot(150);
        int result1 = sample1.getTemperature();
        System.out.println("設定値は" + result1 + "です。");

        Pot sample2 = new Pot(80);
        int result2 = sample2.getTemperature();
        System.out.println("設定値は" + result2 + "です。");
    }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/15 07:59

    ありがとうございます!
    以後気をつけたいと思います!

    キャンセル

+1

>setResultの役割がよくわかりません。
>getResultは呼び出しされているのにも関わらず、setResultはインスタンス化すらされておらず、一体何を行なっているものなのか分からず、質問させていただきました。

コンストラクタは、クラスがインスタンス化(new)された時に動くメソッドです。初期値をオブジェクトにセットしたい場合なんかで、コンストラクタは使われます。

このサンプルプログラムでも、new Sample(150)してコンストラクタで150をセットしているようですね。そのためsetResult()は不要だったのでしょう。

なお、クラスをインスタンス化(new)してオブジェクトを生成すると、その元のクラスに実装されていたメソッドやメンバ変数が使えるようになります。

その元クラスに実装されていたメソッドやメンバ変数を使用するために、再びインスタンス化(new)を行う必要はありません。'インスタンスを詰めた変数→sample1.getResult();'のようにして、メソッドを呼び出します。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/15 08:31

    回答ありがとうございます!とても分かりやすいです!
    コンストラクタの挙動が理解できていなかったようです。
    なるほど…!呼び出していないだけで、setResultも使用できる状態にはあるのですね!
    コンストラクタで値をセットせずに、メインクラスでsetResultを呼び出して値をセットすることでも同じ動きができる。ということですよね?

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.75%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Java

    13119questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。