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

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

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

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

2208閲覧

セッターゲッターメソッドを使って値を変更するにはどうしたらいいのでしょうか?

yyy000

総合スコア5

Java

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/05/13 09:26

編集2020/05/13 10:05

###実現したいこと
SampleModelの値をセッターゲッターメソッドを使って変更するにはどうしたらいいのでしょうか?
値の変更は元の値から―1したいです。
今の書き方ではうまくいきません。なぜでしょうか?

Java

1package sample; 2 3public class SampleModel { 4 5 private int battery; 6 7 public SampleModel(int battery) { 8 this.battery = battery; 9 } 10 11 public int getBattery() { 12 return battery; 13 } 14 15 public void setBattery(int battery) { 16 this.battery = battery; 17 } 18} 19

java

1package sample; 2 3public class SampleUse { 4 SampleModel m = new SampleModel(5); 5 int battery = m.getBattery(); 6 7 public void useBattery(){ 8 int useBattery = battery -1; 9 System.out.println(useBattery); 10 m.setBattery(useBattery); 11 } 12 13 public void nowBattery() { 14 System.out.println(battery); 15 } 16 17}

java

1package sample; 2 3public class SampleController { 4 5 public static void main(String[] args) { 6 7 SampleUse u = new SampleUse(); 8 u.nowBattery(); 9 10 u.useBattery(); 11 u.nowBattery(); 12 13 } 14 15} 16

###そのほか
Eclipseの2020年版を使っています

元の値というのは
SampleModel m = new SampleModel(5);
で入れたSampleModelクラス内の変数「battery」の「5」です

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

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

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

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

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

m.ts10806

2020/05/13 09:44

「元の値」ってどこのことでしょう。
guest

回答2

0

おそらく、期待通りに -1 できています。
ただ、SampleUse クラスの nowBattery() メソッドが返しているのが、SampleModel クラスの battery プロパティではなく、 SampleUse クラスの battery プロパティであるため、変化していないように見えるのだと思います。

java

1public class SampleUse { 2 // ...省略 3 public void nowBattery() { 4 System.out.println(m.getBattery()); 5 } 6}

としたら期待通りの動作になりませんか?

補足:SampleUse クラスで battery プロパティを定義するのはやめたほうがいいと思います。

投稿2020/05/13 10:47

編集2020/05/13 10:48
R.Mizukami

総合スコア1086

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

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

0

ベストアンサー

get-1をsetすれば良いのでは。

java

1setHoge(getHoge()-1);

今の書き方ではうまくいきません。なぜでしょうか?

「うまくいかない」が何が起きているかによるのですけど、
現状のコードはSampleModel の値ではなくSampleUse のプロパティbattery を更新してるだけです。
どこのどの情報を更新したいのでしょうか。

整理

この作りだとSampleUse に必要なのはprivateにしたSampleModelだけだと思います。
SampleUseにデータそのものを持ってしまってはModelに持っているものとは別物になります。

SampleModel

java

1package sample.model; 2 3import lombok.Data; 4 5@Data 6public class SampleModel { 7 private int battery; 8} 9

SampleUse

java

1package sample.use; 2 3import sample.model.SampleModel; 4 5public class SampleUse { 6 private SampleModel model; 7 public SampleUse(int defaultBattery){ 8 this.model = new SampleModel(); 9 this.model.setBattery(defaultBattery); 10 } 11 public void useBattery() { 12 this.model.setBattery(this.model.getBattery()-1); 13 } 14 public void outputBattery() { 15 System.out.println(this.model.getBattery()); 16 } 17 18} 19

SampleController

java

1package sample.controller; 2 3import sample.use.SampleUse; 4 5public class SampleController { 6 7 public static void main(String[] args) { 8 SampleUse use = new SampleUse(5); 9 use.outputBattery(); 10 use.useBattery(); 11 use.outputBattery(); 12 } 13 14} 15

※Getter,Setterを自身の書くコードに置きたくないのでlombokを利用しました。
※sampleプロジェクトとはいえ、役割できちんとパッケージをわけるべきと考え、勝手にパッケージ追加しました
※個人的にプロパティでnewしたりデータ代入したりロジックっぽいの書くの嫌いなのでコンストラクタで行っています
※nowBattery()では名前から「今の値を返す」ように見えるので、メソッド名変えてます。

投稿2020/05/13 09:37

編集2020/05/13 11:03
m.ts10806

総合スコア80875

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

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

yyy000

2020/05/13 09:50 編集

いつもありがとうございます。 教えていただいたように ```java public class SampleUse { SampleModel m = new SampleModel(5); public void useBattery(){ m.setBattery(m.getBattery() -1); } public void nowBattery() { System.out.println(m.getBattery()); } } ``` にしたところ値を変更することができました!ありがとうございます。 しかし、なぜ私の最初のやつではうまくいかなかったのでしょうか? 変数useBatteryには同じようにgetBattery-1の値である4が入っていると思ったのですが、ここのところがよくわかりません。 今後は教えていただいた書き方をしますが、うまくいかなかった理由が知りたいので、もしよろしければ教えていただけないでしょうか
yyy000

2020/05/13 09:50

すいません、うまく表示させることができませんでした。
m.ts10806

2020/05/13 09:53

「うまく」「うまくいかない」では何も伝えない表現ですので、具体的に現象を記載してください。プログラムは思った通りに動くのではなく書いた通りに動きます。 「元の値」が何なのか分かりません。 ModelなのかUseなのか。 今だとUseの値しか対象になっていないように見えますが。
m.ts10806

2020/05/13 09:54

「Modelの値」としてざっと書きなおしてみます。 少々お時間ください。
m.ts10806

2020/05/13 09:57

「SampleUse 」は何の役割ですか?直接Modelを呼び出したくないだけ?
yyy000

2020/05/13 09:59

「すいません、うまく表示させることができませんでした」というのは、 ↓のMarkdownと呼ばれる記法での表示がうまくできませんということです。 ```html コードの表示(ブロック) ``` 具体的に書くことを今後は意識したいと思います
m.ts10806

2020/05/13 10:00

コメント欄では使えません。
yyy000

2020/05/13 10:02

SampleUseを使っているのは、SampleControllerでできるだけ減らしたいと考えたからです。 できる限り、SampleControllerではmainメソッド以外は定義しないようにしたいです。
m.ts10806

2020/05/13 10:13 編集

現在の内容くらいでしたら、SampleModelを直接newしたほうがシンプルで分かりやすくなるし、短く済みますよ。今のところSampleUserの役割が冗長です。
m.ts10806

2020/05/13 11:17

書き直しました。 「なぜ想定の結果を得られなかったか」は nowBatteryで出力している値はあくまでSampleUseのプロパティだから。 そしてuseBatteryでは int useBattery = battery -1; としていてローカル変数に格納しているのでbatteryが更新されないから。 ○○Useをビジネスロジックのための役割で扱いたいのでしたら、データそのものを持たないのが吉です。 あくまでデータを呼び出したり受け取ったり渡したり計算するためだけに使い、自身ではデータを持たないことが役割分担の考え方です。 設計をしてみると分かると思います。 どこでデータを管理し、ロジックを持ち、それらをどこで扱うのか。 実際のアプリケーションはもっと複雑で入り組んで、クラスも沢山作りますから、現在の小さい構成からでも考えるようにしておくと、規模が大きくなっても迷うことなく作れます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問