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

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

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

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

Q&A

解決済

2回答

1257閲覧

Java カプセル化の問題

parabellum

総合スコア1

Java

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

0グッド

0クリップ

投稿2022/07/19 05:33

Java初心者です。カプセル化の問題を解いています。
問題がわからなくて苦戦しています。
調べてもなかなか解けませんでした…
よければ解答例を教えていただけると幸いです。

問題文↓
金額クラスを作る
StationaryShop を実行すると実行結果の通りになるように、Amount クラスを作成しなさい

※消費税率は 8% とする

このコードの内容は変えてはいけない
ーーーーーーーーーーーーーーーーーーーーーーーーー
public class StationaryShop {

public static void main(String[] args) { Amount myCart = new Amount(0); Amount ballPen = new Amount(120); Amount eraser = new Amount(80); myCart = myCart.add(ballPen); myCart = myCart.add(eraser); myCart = myCart.addTax(); myCart.showValue(); }

}
ーーーーーーーーーーーーーーーーーーーーーーーーー

これより先のAmountクラスを作る

僕はここまで書いて訳が分からなくなってしまいました。
class Amount {
private int myCart;
private Amount ballPen;
private Amount eraser;

public Amount(int myCart) { this.myCart = myCart; } public Amount add(Amount ballPen) { myCart = ballPen; return ballPen; } public Amount addTax(int myCart) { myCart = (int) (myCart * 1.08); return myCart; } public void showValue() { System.out.println("金額は " + myCart + " 円です"); }

よければご教授お願いします。

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

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

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

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

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

Zuishin

2022/07/19 05:35

> 調べてもなかなか解けませんでした… 調べるからです。 復習したら解けます。
usekay

2022/07/19 06:15

カートと商品を同じクラスにするのは微妙な気がする…そもそも問題が悪いですね…
ozwk

2022/07/19 06:20

System.out.println("金額は 216 円です"); としてあとはコンパイル通るように書けば問題の条件を満たせるのでそういう意味でも問題が悪いですね
dodox86

2022/07/19 06:39

こちらの質問、質問者さんに限りませんが、コード全体ではなくメソッドだけをマークダウンの記法にするのが何か最近、流行っているのでしょうかね。そんな風に教えられたのでしょうか。
parabellum

2022/07/19 06:50

4人の方もありがとうございました!! 僕の理解力の低さも相まってなかなか難しい問題でした…
jimbe

2022/07/19 06:56

> メソッドだけをマークダウンの記法にする 想像ですが、コード=実行する部分…という認識なのかもしれませんね。
ozwk

2022/07/19 11:07

> dodox86さん いつからかはわかりませんが、 スペース4つでコードブロック判定になるようになってます
jimbe

2022/07/20 16:56

> スペース4つでコードブロック 私も知りませんでした。 ということは皆さん意図せずたまたまブロックになってたということですね。
dodox86

2022/07/25 07:25

@ozwkさん コメントいただいていたのに気が付きませんでした。すみません、そして情報どうもありがとうございます。なるほど、それで合点がいきました。
guest

回答2

0

実行例が不明ですが、おそらく Amount クラスのインスタンスは数値一つだけ持っていれば良さそうです。

java

1private Amount ballPen; 2private Amount eraser;

この2行は消しましょう。

java

1private int myCart;

これは、金額クラスの値ですから private int price; などのわかりやすい名前にしましょう。

add()addTax() が返り値を持つのは妙な設計の気がしますが、設問の意図ではこれらは this を返すべきなのでしょう。

投稿2022/07/19 06:21

int32_t

総合スコア21929

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

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

parabellum

2022/07/19 06:49

すいません、実行例を書き忘れました… 実行例は  金額は 216 円です となります! めちゃくちゃ助かりました、ありがとうございます!!
usekay

2022/07/19 06:54

myCartも Amountなのでそれではだめなような。
jimbe

2022/07/19 07:15 編集

> add() や addTax() が返り値を持つ Amount は不変ということでしょう。
int32_t

2022/07/19 07:14

> Amouont は不変ということでしょう。 なるほど。それなら少し納得ですね。 であれば、たとえば addTax() は return new Amount((int)(this.price * 1.08)); という感じですね。
usekay

2022/07/19 07:24

まあ計算できりゃなんでもいいので問題としてはそれでいいのでしょうけどオブジェクト指向の学習を目的とした問題としては微妙だなと…
guest

0

ベストアンサー

Amount を「不変」(一度作ったら値が変わらないモノ)とすると思います。

java

1public class StationaryShop { 2 public static void main(String[] args) { 3 Amount myCart = new Amount(0); 4 Amount ballPen = new Amount(120); 5 Amount eraser = new Amount(80); 6 7 myCart = myCart.add(ballPen); 8 myCart = myCart.add(eraser); 9 10 myCart = myCart.addTax(); 11 myCart.showValue(); 12 } 13} 14 15final class Amount { 16 private final int value; 17 18 Amount(int value) { 19 this.value = value; 20 } 21 Amount add(Amount augend) { 22 return new Amount(value + augend.value); 23 } 24 Amount addTax() { 25 return new Amount((int)(value * 1.08)); 26 } 27 void showValue() { 28 System.out.println("金額は " + value + " 円です"); 29 } 30}

実行結果

plain

1金額は 216 円です

投稿2022/07/19 07:10

編集2022/07/19 10:29
jimbe

総合スコア13320

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

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

parabellum

2022/07/19 07:28

詳しいコードまでありがとうございます!! なるほど、「不変」とするのですね… 正直どれだけひねっても思いつきませんでした… ここで折れずに勉強頑張ります!!
jimbe

2022/07/19 10:44

この問題に必ず必要というわけではありませんが、 int32_t さんが回答で書かれている「add() や addTax() が返り値を持つのは妙な設計の気がします」という所で、可変なオブジェクトでは自身が変わ(れ)るので返り値は不要です(有ってイケナイわけではありません)が、不変なクラスオブジェクトでは自身が変わ[れ/ら]ないで新しいオブジェクトを返しますので、不変のほうが自然に感じます。( String や BigDecimal ( https://docs.oracle.com/javase/jp/8/docs/api/java/math/BigDecimal.html ) 等が同様です。 ) 「不変性」や「Immutable」(インミュータブル)、対になる「mutable」(ミュータブル)等をお調べになってみてください。
parabellum

2022/07/21 01:27

なるほど…BigDecimalや「不変性」や「Immutable」(インミュータブル)、対になる「mutable」(ミュータブル)等はまだ勉強していない部分なので頑張ってみます!! 色々教えてくださって助かります!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問