LoginSignup
5
3

More than 3 years have passed since last update.

【Java】一つの戻り値から複数の値を取得する

Last updated at Posted at 2019-05-17

入門用のテキストを読みながら「戻り値が2つ以上返せるなら便利では?」と思ったので、調べつつ試しに書いてみた。一応忘れないようにノート。(Beansやリストという方法もあるみたいだけども勉強します......)

結論から言うと

一つの配列変数かクラス型変数に値をまとめて返すという方法を取った。最終的に「こんなことするくらいならメソッドを増やして一個ずつ返した方が良くないか?」と思いました。

  • 複数の戻り値が同型の場合
    • 基本データ型の配列で返す方法
  • 複数の戻り値が異型の場合
    • Object型の配列で返す方法
    • クラス型で返す方法

アクセス制限のことを考えると、本当はもっと方法は限定されると思う。

1. 複数の戻り値が同型の場合

返したい戻り値が複数あり、すべて同型の場合は基本データ型に入れられるよね、という考え。無理くりdouble型にint型をぶち込んだりすることも出来っちゃ出来るけど、やりたくないよね?と思ったので、その場合は考えていない。

1-1. 基本データ型配列で返す

Sub.java
public class Sub {
    private int A = 100;
    private int B = 200;

    public int[] getAB(){
        int[] array = new int[2];
        array[0] = A;
        array[1] = B;
        return array;
    }
}
Main.java
public class Main {
    public static void main(String[] args){
        Sub sub = new Sub();
        int[] array = sub.getAB(); // ここでSubクラスからint配列が返ってくる。

        System.out.println(array[0]); // 出力
        System.out.println(array[1]);
    }
}
実行結果.
100
200

2. 複数の戻り値が異型の場合

  • 上と同じ考え方でObject型で返す方法
  • クラス型で返してフィールドを呼び出す方法

2-1. Object型配列で返す

上でint[]って書いてた部分がObject[]になった。異型の値でもObject型配列なら一緒に格納できるよね、という考え。

Sub.java
public class Sub {
    private int A = 100;
    private double B = 200.0;

    public Object[] getAB() {
        Object[] array = new Object[2];
        array[0] = A;
        array[1] = B;
        return array;
    }
}
Main.java
public class Main {
    public static void main(String[] args) {
        Sub sub = new Sub();
        Object[] array = sub.getAB();

        System.out.println(array[0]);
        System.out.println(array[1]);
    }
}
実行結果.
100
200.0

この記事で書いてる方法の中では一番まし?

2-2. クラス型で返す

オブジェクトを返した後から、そのオブジェクトのフィールドをメインメソッドで呼び出せば出来るよね、という考え。出来るには出来るがアクセス修飾子を使ってのアクセス制限ができない欠点。

Sub.java
public class Sub {
    int circleAreaInt;
    double circleAreaDouble;

    public Sub calcCircleArea(int r) {
        Sub sub = new Sub();
        sub.circleAreaInt = 3 * r * r ;
        sub.circleAreaDouble = 3.14 * r * r;
        return sub;
    }
}
Main.java
public class Main {
    public static void main(String[] args) {
        Sub sub = new Sub();
        sub = sub.calcCircleArea(2);

        System.out.println(sub.circleAreaInt);
        System.out.println(sub.circleAreaDouble);
    }
}
実行結果.
12
12.56

引数(int)として円の半径rを渡すと、ゆとり世代の円周率(3)と非ゆとり世代の円周率(3.14)の両方で円の面積を計算して返してくれるメソッド......なのだが、あんまりいい例が思いつかなかった。こんな書き方をする必要はない。

参考書籍

やさしいJava第7版
Pp.251

5
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3