いろんなやり方がありますが、それぞれどんな時に使うのかを書いてみます。
なお、以下のコード例は、特に断り書きがなければ A クラスのメソッドに書く感じで、b という変数は B クラスのオブジェクトとします。
1) 別々のメソッドで返す
getFruit と getColor の 2 つのメソッドに分ける方法ですが、フルーツの名前と色を関連づけて返したいなら、関連づけるための手段 (主に引数) が必要になります。
1-a) フルーツの順番が決まっていて、その何番目という方法で指定したいなら、両方に引数 int index を持たせます。
java
1int index = ...
2String fruit = b.getFruit(index); // index番目のフルーツの名前を返す
3String color = b.getColor(index); // index番目のフルーツの色を返す
1-b) フルーツの名前が分かれば色が決まるなら、まず getFruit を呼び、その戻り値を使って getColor を呼ぶことになるでしょう。(なお、両方とも引数なしにしてそれぞれランダムな値を返すと、fruit と color の値には何の関係もなくなってしまいます。)
java
1String fruit = b.getFruit(); // 引数なし (ランダムに返す、など)
2String color = b.getColor(fruit); // 引数 (String fruit) に対応する色を返す
1-c) b オブジェクトが「現在のフルーツはこれ」という状態を持ち、getFruit や getColor は現在のフルーツに関する情報を返す、ということも考えられます。この場合、b は状態を更新するメソッドを持ってたり、何かの条件によって自動的に状態が更新されたりするでしょう。
java
1String fruit1 = b.getFruit(); // 現在のフルーツの名前を返す
2String color1 = b.getColor(); // 現在のフルーツの色を返す
3
4b.updateCurrentFruit(); // 現在のフルーツを更新する
5String fruit2 = b.getFruit(); // 更新されたフルーツの名前を返す
6String color2 = b.getColor(); // 更新されたフルーツの色を返す
2) 配列で返す
フルーツの名前と色がどちらも文字列なので、文字列の配列で返すこともできます。
ただし、戻り値が長さ 2 の配列で、最初の要素はフルーツの名前、次の要素はフルーツの色ということが、ソースコードからは読み取りにくく、名前と色を取り違えたりするバグの元になります。
また、型が違うものを返す場合は Object の配列で返して、それぞれの値をキャストすることになるため、さらに分かりにくくなります。
なお、2) 以降ではメソッドの引数は省略しますが、必要に応じて int index などの引数を持たせてください。(ランダムに返す場合などは引数は不要ですが。)
java
1String[] result = b.getFruitAndColor(); // フルーツの名前と色を配列で返す
2String fruit = result[0]; // 最初の要素はフルーツの名前
3String color = result[1]; // 次の要素はフルーツの色
3) Pair (あれば) で返す
配列で返す場合の問題点を解決するために、他の多くの言語には「タプル」という型があります。
これは、わざわざクラスを作るまでもない、値の一時的な組み合わせを表すために使われます。
残念ながら Java の標準ライブラリにはありませんが、多くのライブラリが Pair などのクラスを用意していますし、自分で作ることもできます。
参考: JavaでTupleが欲しくなったときメモ - Qiita
参考: java - Can not resolve import javafx.util.Pair in android studio - Stack Overflow ← 自分で作るなら、この回答が一番シンプル。
ここでは JavaFX の javafx.util.Pair を使ってみましょう。まず、B クラスの実装ですが、Pair<String, String>
は 2 つの値 (どちらも String 型) を持つペアを表すオブジェクトです。
java
1import javafx.util.Pair;
2
3public class B {
4 // いろいろ省略
5
6 public Pair<String, String> getFruitAndColor() {
7 String fruit = "ばなな";
8 String color = "yellow";
9 return new Pair<String, String>(fruit, color);
10 }
11}
使う側はこんな感じになります。key と value のどっちが名前でどっちが色かを確認する必要はありますが、配列と違って要素数を気にする必要はありませんし、key と value の型が違っても大丈夫です。
java
1Pair<String, String> pair = b.getFruitAndColor(); // フルーツの名前と色を Pair で返す
2String fruit = pair.getKey(); // key はフルーツの名前
3String color = pair.getValue(); // value はフルーツの色
4) クラスを作る
フルーツの名前と色の組み合わせに大きな意味があったり、その組み合わせをいろんなところで使うなら、クラスを作ることを考えましょう。
ここで大事なのが、適切な名前をつけることです。例えば、それが「フルーツである (その要素として名前や色がある)」ことが大事なら、Fruit クラスになるでしょう。また、実はある人の「好きなフルーツ」と「好きな色」の組み合わせなら、Favorites というクラスになるかもしれません。
クラスを作ることで、B クラスの情報の持ち方も変わってくるでしょう。フルーツの名前と色を別々に持つのではなく、「赤いリンゴ」や「オレンジ色のみかん」などの Fruit オブジェクトを管理する、という考え方に切り替えることになります。
java
1public class Fruit {
2 private String name;
3 private String color;
4
5 public Fruit(String name, String color) {
6 this.name = name;
7 this.color = color;
8 }
9
10 public String getName() {
11 return name;
12 }
13
14 public String getColor() {
15 return color;
16 }
17}
5) コールバック関数
最後におまけで、コールバック関数で情報を受け取る方法も書いてみます。(分からなかったら無視してください。)
例えば、一度に複数の組み合わせを処理したり、情報を非同期で受け取ったりする場合に使うと便利です。
java
1public class B {
2 public interface FruitCallback {
3 void call(String fruit, String color);
4 }
5
6 public void getFruit(FruitCallback callback) {
7 String fruit = "パイン";
8 String color = "yellow";
9 callback.call(fruit, color);
10 }
11}
呼び出し方 (匿名インナークラス)
java
1b.getFruit(new B.FruitCallback() {
2 public void call(String fruit, String color) {
3 System.out.println("好きなフルーツは" + color + "色の" + fruit + "です。");
4 }
5});
呼び出し方 (ラムダ式の場合)
java
1b.getFruit((fruit, color) -> {
2 System.out.println("好きなフルーツは" + color + "色の" + fruit + "です。");
3});