入門用のテキストを読みながら「戻り値が2つ以上返せるなら便利では?」と思ったので、調べつつ試しに書いてみた。一応忘れないようにノート。(Beansやリストという方法もあるみたいだけども勉強します......)
結論から言うと#
一つの配列変数かクラス型変数に値をまとめて返すという方法を取った。最終的に「こんなことするくらいならメソッドを増やして一個ずつ返した方が良くないか?」と思いました。
- 複数の戻り値が同型の場合
- 基本データ型の配列で返す方法
- 複数の戻り値が異型の場合
- Object型の配列で返す方法
- クラス型で返す方法
アクセス制限のことを考えると、本当はもっと方法は限定されると思う。
1. 複数の戻り値が同型の場合#
返したい戻り値が複数あり、すべて同型の場合は基本データ型に入れられるよね、という考え。無理くりdouble型にint型をぶち込んだりすることも出来っちゃ出来るけど、やりたくないよね?と思ったので、その場合は考えていない。
1-1. 基本データ型配列で返す###
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;
}
}
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型配列なら一緒に格納できるよね、という考え。
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;
}
}
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. クラス型で返す###
オブジェクトを返した後から、そのオブジェクトのフィールドをメインメソッドで呼び出せば出来るよね、という考え。出来るには出来るがアクセス修飾子を使ってのアクセス制限ができない欠点。
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;
}
}
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)の両方で円の面積を計算して返してくれるメソッド......なのだが、あんまりいい例が思いつかなかった。こんな書き方をする必要はない。