Javaのコードがわからないので質問しました。 1. クラスtestのinterface InterとクラスExpのInter aaaと書かれているのですが、何をしているのかわかりません。この処理の名称などがあれば、教えてください。 2. Expのインスタンスを生成し、iやsから変数を参照、またはreturnで変数を返すことはできますか。 よろしくおねがいします。
public class test { public interface Inter { public int Pass(); } class Exp{ public Inter aaa(int i, int j, String s) { return null; } } }
###補足情報(言語/FW/ツール等のバージョンなど)
Java, Eclipse oxygen
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
何をしているのかわかりません
そもそも、ご質問のサンプルコードが、
何がしたいのか、意図が分かりにくいコードです。
「test」とか「aaa」とか名前が適当だし、
期待される返り値(の型)に反して、「null」を返しているとか、
いかにも書きかけっぽいです。お手本にすべきではありません。
元サンプルで大事なのは、インターフェイスだと思うので、
それが分かりやすくなるように、新サンプルを書き下ろしました。
java
1public class Machine { 2 public interface Bottle { 3 public String open(); 4 } 5 6 public Bottle select(int button) { 7 Bottle product = null; 8 if (button == 1) { product = new DrinkA(); } 9 if (button == 2) { product = new DrinkB(); } 10 return product; 11 } 12 13 private class DrinkA implements Bottle { 14 public String open() { 15 return "tea"; 16 } 17 } 18 19 private class DrinkB implements Bottle { 20 public String open() { 21 return "coffee"; 22 } 23 } 24}
java
1class Client { 2 public static void main(String args[]) { 3 Machine vender = new Machine(); 4 int button = 1; 5 Machine.Bottle product = vender.select(button); 6 String result = product.open(); 7 System.out.println(result); 8 } 9}
上記サンプルコードを説明しますと、自動販売機をイメージしています。
購入者(クライアント)クラスから、自販機(マシーン)クラスを利用します。
ボタンを押すと、お茶かコーヒーが出てくるだけの、簡単な例です。
さて、インターフェイスがどのような意味を持っているかというと、
まず、「select」メソッドは、インターフェイス型の(参照する)値を返します。
今回の例では「Bottle」がインターフェイスで、「DrinkA」「DrinkB」が、
インターフェイスに規定された「open」メソッドを実装しています。
これによって、利用側の購入者クラスから、
IF文を消しているし、「DrinkA/B」という実装クラスも消しています。
これで、IF文で分岐して、newをベタ書きするのに比べて、メンテナンスしやすくなります。
なぜなら、インターフェイスで実装から分離されているので、
利用側のクラスを変更しないまま、実装クラスを交換できるからです。
それに今回の場合、「DrinkA/B」はprivateの内部クラスなので、
外部からインスタンスを勝手に作れないです。
これはひとりで書いていると意味が分かりにくいですが、
そもそもJavaは、企業が開発して、企業が利用している、大規模開発向け言語です。
そこで、自販機クラスを利用する側とされる側で、別人や別組織が実装している場合、
分離が非常に重要な意味を持ちます。利用する側にされる側の実装が入り込んでしまうと、
本体をクラスライブラリで拡張したいときなどに、本体がデグレする可能性が出てしまう。
だから、インターフェイスは実装が空だから、行数が多少増える、といった些細なことより、
実装から分離することの方が大事なんです。インターフェイスはJavaの中心的な機能です。
GOFも「(実装ではなく)インターフェイスに対してプログラミングせよ」と言っています。
デザインパターンを研究すると、こういう仕組みはよく分かります。
詳細は省きますが、上のコードはファクトリ(メソッド)パターンを使ってます。
Machine.Bottle product = vender.select(button);
もう少し裏側も見ておくと、インターフェイスで実装を切り離すことで、
利用側からIF文などが消えて宣言的に読めるのもメリットです。
上の一行を適当に意訳して読み下すと、
「販売機のボタンを選択した結果が、自販機向け飲料の製品である」
となります。翻訳調で不自然な日本語ですが、大筋の意味は通ると思います。
さらにたとえば、自販機にコインを投入する機能をつけたとして、
1年後に読んでも、「Bottle」と「Money」を取り違えることはまずないでしょう。
これが、「aaa」と「bbb」とかだと、どっちがどっちだか、すぐ分からなくなります。
書いているときは覚えていても、長期間に渡って保守すると負債になってきます。
また、名前が「aaa」などだと意味が分からないので、毎回実装を読む必要があります。
しかし、大規模はコード量が大量なので、なるべく実装を読まないで使いたい。
これには違和感があるかもしれませんが、標準ライブラリなどは、なるべく読みたくないでしょう。
それなら、自分たちのコードを標準ライブラリに近づければ、組みやすくなります。
ドメインの言葉、業務の言葉、今回なら自販機を利用するシーンの言葉に近づけると、
利用しやすいし、変更しやすくなります。人間が理解しやすいからです。
まあサンプルなので、この例自体は微妙かもしれませんが、少なくとも、
質問文のサンプルコードの「aaa」とかよりは確実にマシだと思います。
もちろん、本番で書くときは、余裕さえあれば、ここからもっと、
ドメインに沿った命名にリファクタリングしていきます。
今回、「内部クラス(インナークラス)」や「ネストした型」に関しては、省略しました。
解説が中途半端にならないよう、インターフェイスの方を優先しました。
内部クラスはわりとマニアックな文法なので、下記リンクの解説記事に譲ります。
(ただもし、クラスが作れない環境とかだと多用せざるをえないかも……)
投稿2017/11/21 10:04
編集2017/11/21 13:02総合スコア5592
0
どの処理が分からないのかご質問の内容から理解しきれていないかもしれませんが、
InterインタフェースやExpクラスはtestクラスの内部インタフェースや内部クラス(インナークラス)と呼ぶものかと思います。
ExpクラスのaaaメソッドはInterインタフェースの値を戻り値として定義している、通常のメソッド宣言です。
インスタンスの生成は下記のように行えるかと思います。
下記ではTestクラスとクラス名を大文字で始めるようにしています。
java
1public class Test { 2 public interface Inter 3 { 4 public int Pass(); 5 } 6 7 class Exp{ 8 public Inter aaa(int i, int j, String s) 9 { 10 return null; 11 } 12 } 13} 14class Main { 15 public static void main(String args[]) { 16 Test test = new Test(); 17 Test.Exp exp = test.new Exp(); 18 Test.Inter inter = exp.aaa(1, 2, ""); 19 20 System.out.println(test); 21 System.out.println(exp); 22 System.out.println(inter); 23 } 24} 25 26/* 27$ java Main 28Test@6073f712 29Test$Exp@43556938 30null 31*/
追記:
コメントでの指摘を受け、表現を修正しています。
- サブインタフェース → 内部インタフェース
- サブクラス → 内部クラス(インナークラス)
投稿2017/11/20 17:52
編集2017/11/21 00:31退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/11/21 00:31 編集
2017/11/21 00:37
2017/11/21 01:30
2017/11/21 02:19
2017/11/21 02:25
退会済みユーザー
2017/11/21 15:24
0
「書かれているのですが、何をしているのかわかりません」
とあるため、おそらくこのコードは質問者自体が書いたコードではないと推測されますが、一体何を参考にしたのですか? 実際のプログラムとしてはまったく意味のないコードが書かれており、単に入れ子のインスタンスや内部クラスの仕組みを試そうとするだけのもののような気がします。
まず、入れ子のインターフェイスや内部クラスが理解できていない段階であれば、トップレベルの独立したインターフェイスやクラスにした方がいいでしょう。
Expのインスタンスを生成し、iやsから変数を参照、またはreturnで変数を返すことはできますか。
メソッドからreturnで返されるのは常に何らかの「値(もしくは参照)」です。「変数を返す」ということはできません。変数に代入されている値を返すことはできますが。
投稿2017/11/21 00:50
総合スコア402
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/11/21 15:18
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/11/21 15:17
2017/11/21 15:25
退会済みユーザー
2017/11/21 16:21