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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

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

Q&A

解決済

3回答

340閲覧

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

SRisu

総合スコア5

Java

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

0グッド

0クリップ

投稿2018/05/14 16:16

編集2018/05/14 16:18

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

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

該当のソースコード

java

1public class Sample{ 2 3 private int number; 4 5 public Sample(int number){ 6 this.number = cutResult(number); 7 } 8 9 public int getResult(){ 10 return this.number; 11 } 12 13 public void setResult(int number){ 14 this.number = cutResult(number); 15 } 16 17 private int cutResult(int number){ 18 if(number >= 100){ 19 return 100; 20 } 21 return number; 22 } 23} 24 25class Main{ 26 public static void main(String[] args){ 27 28 Sample sample1 = new Sample(150); 29 int result1 = sample1.getResult(); 30 System.out.println("設定値は" + result1 + "です。"); 31 32 Sample sample2 = new Sample(80); 33 int result2 = sample2.getResult(); 34 System.out.println("設定値は" + result2 + "です。"); 35 } 36}

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

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

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

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

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

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

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

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

Java

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

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

Java

1public void setResult(int number){ 2 this.number = cutResult(number); 3} 4 5private int cutResult(int number){ 6 if(number >= 100){ 7 return 100; 8 } 9 return number; 10}

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

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

なお

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

Java

1public Sample(int number){ 2 setResult(number); 3}

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

投稿2018/05/14 16:39

編集2018/05/14 16:47
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SRisu

2018/05/14 17:08

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

2018/05/14 23:21

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

0

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

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

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

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

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

Java

1class Pot{ 2 private int temperature; 3 private static final int BOILING_POINT = 100; 4 public Pot(int temperature){ 5 setTemperature(temperature); 6 } 7 public int getTemperature(){ 8 return this.temperature; 9 } 10 public void setTemperature(int temperature){ 11 this.temperature= Math.min(temperature, BOILING_POINT); 12 } 13} 14class Wandbox 15{ 16 public static void main(String[] args){ 17 // 以下の変数 sample1, result1 も同様に適切な名前に変更すると後で見直した時に後悔しないです。 18 Pot sample1 = new Pot(150); 19 int result1 = sample1.getTemperature(); 20 System.out.println("設定値は" + result1 + "です。"); 21 22 Pot sample2 = new Pot(80); 23 int result2 = sample2.getTemperature(); 24 System.out.println("設定値は" + result2 + "です。"); 25 } 26}

投稿2018/05/14 17:25

編集2018/05/14 18:13
umyu

総合スコア5846

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SRisu

2018/05/14 22:59

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

0

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

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

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

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

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

投稿2018/05/14 23:10

yukapome789

総合スコア361

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SRisu

2018/05/14 23:31

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問