Javaのメソッドから複数の値を返す
この投稿では、Javaのメソッドから複数の値を返す方法について説明します。
Java言語仕様に従って、Javaのメソッドは一度に1つの値しか返すことができません。したがって、メソッドから複数の値を返すことは、理論的にはJavaでは不可能です。しかし、Javaの優れている点は、いくつかの賢い回避策で望ましいことを実行できるという事実にあります。この投稿では、これを実現するために利用できるいくつかの選択肢の概要を説明します。
1.を使用して POJO
クラスインスタンス
これは、Javaのメソッドから複数の値を返すために最も一般的に使用されるメソッドです。アイデアは、返したいすべてのフィールドを含むクラスのインスタンスを返すことです。
このクラスは、パブリックメンバー変数を持つPOJOと、必要な値でフィールドを開始するためのパブリックコンストラクターにすることができます JavaBean
プライベートメンバー変数と引数なしのパブリックコンストラクターに対応するゲッターとセッターを使用します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
//複数のフィールドをグループ化するためのPOGO final class Person { public String name; public int age; public char gender; public Person(String name, int age, char gender) { this.name = name; this.age = age; this.gender = gender; } } class Main { public static Person getDetails() { //メソッドから個人の詳細を返します String name = "Ryan"; int age = 25; char gender = 'M'; return new Person(name, age, gender); } //Javaのメソッドから複数の値を返します public static void main(String[] args) { Person person = getDetails(); System.out.println("Name is " + person.name); System.out.println("Age is " + person.age); System.out.println("Gender is " + person.gender); } } |
出力:
Name is Ryan
Age is 25
Gender is M
以下で説明する他の方法に比べてこの方法を使用する利点は、型の安全性を提供し、コードの読みやすさを大幅に向上させることです。
以下は、オブジェクトアレイを使用してすべての必須フィールドを格納する上記のプログラムのより単純なバージョンですが、型安全性を提供したり、フィールド情報を呼び出し元に渡したりすることはありません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
import java.util.Arrays; //複数のフィールドをグループ化するためのクラス class Collection { private Object[] items; private final int size; //オブジェクトアレイを作成し、指定された値で初期化します public Collection(Object... values) { this.size = values.length; this.items = Arrays.copyOf(values, size); } public Object get(int i) { return items[i]; } public int getSize() { return size; } @Override public String toString() { return Arrays.toString(items); } } class Main { public static Collection getDetails() { String name = "Ryan"; int age = 25; char gender = 'M'; long income = 100000; return new Collection(name, age, gender, income); } //Javaのメソッドから複数の値を返します public static void main(String[] args) { Collection details = getDetails(); System.out.println("The returned values are " + details); System.out.println("The collection size is " + details.getSize()); System.out.println("The name field has value " + details.get(0)); } } |
出力:
The returned values are [Ryan, 25, M, 100000]
The collection size is 4
The name field has value Ryan
また、汎用ペアまたは汎用タプルを実装することもできます。これにより、メソッドから2つまたは3つのフィールドを返す必要がある場合に、型の安全性も提供されます。
2.使用する javafx.util.Pair
class
Java 8以降では、 Pair に含まれるクラス javafx.util
名前と値のペアを表すパッケージ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
import javafx.util.Pair; class Main { public static Pair[] getDetails() { return new Pair[] { new Pair<>("name", "Ryan"), new Pair<>("age", 25), new Pair<>("gender", 'M') }; } //Java8以降のメソッドから複数の値を返します public static void main(String[] args) { Pair[] person = getDetails(); for (int i = 0; i < person.length; i++) { System.out.println("{" + person[i].getKey() + " : " + person[i].getValue() + "}"); } } } |
出力:
{name : Ryan}
{age : 25}
{gender : M}
3.特定のタイプのアレイまたはオブジェクトアレイを返します
これはこれまでで最も単純なアプローチですが、型安全性(オブジェクトアレイの場合)を提供したり、フィールド情報を呼び出し元に渡したりすることはありません。同じタイプの引数の場合、次のようなことができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import java.util.Arrays; class Main { public static int[] getDetails() { int v1 = 30; int v2 = 50; int v3 = 100; return new int[] { v1, v2, v3 }; } //Javaのメソッドから複数の値を返します public static void main(String[] args) { int[] ints = getDetails(); System.out.println(Arrays.toString(ints)); } } |
出力:
[30, 50, 100]
マルチタイプの引数の場合、以下に示すように、オブジェクトのアレイを返すことができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
import java.util.Arrays; class Main { public static Object[] getDetails() { String name = "Ryan"; int age = 25; char gender = 'M'; long income = 100000; return new Object[] { name, age, gender, income }; } //Javaのメソッドから複数の値を返します public static void main(String[] args) { Object[] person = getDetails(); System.out.println(Arrays.toString(person)); } } |
出力:
[Ryan, 25, M, 100000]
4.コレクションを返却します
アレイを返す代わりに、 Collection
。たとえば、次のプログラムは List
アレイの代わりに。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
import java.util.Arrays; import java.util.List; class Main { public static List<Object> getDetails() { String name = "Ryan"; int age = 25; char gender = 'M'; long income = 100000; return Arrays.asList(name, age, gender, income); } //Javaのメソッドから複数の値を返します public static void main(String[] args) { List<Object> person = getDetails(); System.out.println(person); } } |
出力:
[Ryan, 25, M, 100000]
を使って List
フィールド情報を呼び出し元に渡しません。次に示すように、代わりにマップを作成して、フィールド名とその値をキーと値のペアとして渡すことができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
import java.util.AbstractMap; import java.util.Map; import java.util.stream.Collectors; import java.util.stream.Stream; class Main { public static Map<String, String> getDetails() { return Stream.of( new AbstractMap.SimpleEntry<>("name", "Ryan"), new AbstractMap.SimpleEntry<>("age", "25"), new AbstractMap.SimpleEntry<>("gender", "Male"), new AbstractMap.SimpleEntry<>("income", "100000$") ) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); } //Javaのメソッドから複数の値を返します public static void main(String[] args) { Map<String, String> person = getDetails(); for (String key: person.keySet()) { System.out.println(key + " is " + person.get(key)); } } } |
出力:
income is 100000$
gender is Male
name is Ryan
age is 25
5.区切り文字を使用する
ここでの考え方は、区切り文字で区切られたすべての値で構成される文字列を返すことです。次に、呼び出し元メソッド内の値を使用する前に、同じ区切り文字を使用して文字列を分割する必要があります。
このアプローチはそれほど巧妙ではありませんが、モデルとビューの間でデータを転送するために多くのレガシープロジェクトで広く使用されています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
class Main { public static String getDetails() { return "George" + "~" + "Martin"; } //Javaのメソッドから複数の値を返します public static void main(String[] args) { String[] name = getDetails().split("~"); for (String s: name) { System.out.println(s); } } } |
出力:
George
Martin
これで、Javaのメソッドから複数の値を返すことができます。
以下も参照してください。