例えば、他のクラスのメソッドに何らかのインスタンス配列を渡してやって、その中から何らかの基準で選択して要素を返すようなメソッドを考えます。
さらに、同時に配列のどの位置が選ばれたのかを知りたい場合は、みなさんならばどう対処しますか?
class Hoge{}
class A {
public Hoge select(Hoge h[]){
return h[(int)(Math.rand()*h.length)];
}
}
class Test{
public static void main(String argv[]){
A a = new A();
Hoge hoge[] = new Hoge[100];
Hoge h = a.select(hoge);//同時にどの位置が選択されたかも知りたい
}
}
上の例だと、「最初から選択された位置を返して、それからHogeインスタンスを得ればいいじゃないか」という話もごもっともなのですが、もし仮にJavaがポインタを許すと仮定した場合の
Hoge select(Hoge h[], int *n){
return h[*n = (int)(Math.rand()*h.length)];
}
Hoge h = select(hoge, &idx);
に代わるような方法はないものかなぁ。。
という素朴な疑問から質問をしてみました。
考え付いた方法は、サイズ1のint配列を引数に渡して値をセットするか, 欲しい値などをメンバにもつクラスを定義してやって、それを select から返す方法か・・くらいです。
みなさんならこういった場合(メソッドにより取得したい値がいっぱいある場合)
、どうしますか?
No.1ベストアンサー
- 回答日時:
メソッドで複数の値を取得したい場合、次の2パターンがあります。
(1)戻り値で複数の値を入れたオブジェクトを返す。
(2)引数に参照型使って受け渡しをする。(参照渡し…)
スマートな方法としては、(1)番でしょう。
例えば、ユーザIDを渡して、個人情報(氏名、年齢、性別)の3項目を取得したい場合、次のようにします。
// UserBeanクラス
public class UserBean{
private String name; // 名前
private int age; // 年齢
private int sex; // 性別
// アクセッサメソッド
public string GetName(){
return this.name;
}
public void SetName(String name){
this.name = name;
}
// 残りの項目も、アクセッサを定義…
}
で、ユーザ情報を取得するメソッド(GetUserInfoメソッド)は次のようになります。
public UserBean GetUserInfo(int userID){
UserBean userBean = new UserBean();
// TODO: userBeanの情報を取得する処理など…
userBean.SetName("Hogehoge");
userBean.SetAge(10);
userBean.SetSex(1);
return userBean;
}
GetUserInfoメソッドを呼び出す場合、次のようにします。
UserBean ub = xxx.GetUserInfo(1234);
ご回答、ありがとうございます。
なるほど、ということは別にクラスを設けるという方法がスマートということなんですね。
ソースまで下さってありがとうございますm(_ _)m
bean の意味がちょっと気になりますが、大変参考になりました!
No.4
- 回答日時:
ちょっといまいち実現したい機能と方針がつかめないのですが、
>メソッドにより取得したい値がいっぱいある場合、どうしますか?
という部分を質問と考え答えます。Javaもしくはオブジェクト指向では、必ずしも結果の値を返す必要はありません。呼び出すメソッドを持つオブジェクトが保持していればいいのです。
例えばHogeSelectorというクラスがあり、selectというメソッドがあったとします。戻り値はvoidです。で、selectを呼び出したあとに、HogeSelectorのインスタンスは呼び出されたあとの状態を保持し、get…というメソッドいくつかの種類の状態を取得することができるという感じ。どうでしょう?
ご回答ありがとうございます。
> ちょっといまいち実現したい機能と方針がつかめないのですが
ちょっと分かりにくかったですよね、ごめんなさい。
自分はまだオブジェクト指向になれていないせいもあってこのような疑問が出てきたのかもしれませんが、
例えば、C言語で,
int test(a, &b, &c, &d, &e, &f);
という呼び出しにおいて、一度の関数呼び出しで b, c, d, e, f に値を保持、もしくは変更することが可能ですよね。
それにかわる Java で一般的な方法 があれば知りたいなという意図があって質問してみました。
>呼び出すメソッドを持つオブジェクトが保持していればいいのです。
これは #2さんと似た方法ですよね。
この考えもちゃんと頭に入れて、ケースバイケースでうまく使い分けられたらいいなぁと思います。
早くオブジェクト指向に慣れたいですね(苦笑
No.3
- 回答日時:
ポインタをイメージしているのであれば
新しいBeanを作って参照渡しするのが近いのでは。
class A {
public Hoge select(Hoge h[], SampleBean bean){
int i = (int)(Math.rand()*h.length);
bean.setCnt(i);
return h[i];
}
}
class Test{
public static void main(String argv[]){
A a = new A();
SampleBean bean = new SampleBean();
Hoge hoge[] = new Hoge[100];
Hoge h = a.select(hoge, bean);//同時にどの位置が選択されたかも知りたい
}
}
class SampleBean{
private int cnt = 0;
public void setCnt(int cnt){
this.cnt = cnt;
}
public int getCnt(){
return cnt;
}
}
ご回答ありがとうございました。
やはり、オブジェクトを作ってやらないと、参照渡しみたいなことはできないんですね。(当然ですが・・)
こちらの方法も大変参考になりました。
これならば、戻り値を変更しないで、class SampleBean を追加するだけで済みそうですよね.
#1 さんのご回答でもそうでしたが、Bean という言葉が気になるので、それについては調べてみます。
No.2
- 回答日時:
質問者のおっしゃる方法以外では、
class Aの方で、選択した位置(最後にselectした時の状態)を保持するというのもあるかと思います。
一般的には、複数の値を返す必要が有る場合には、そのようなオブジェクトを返すのがいいかと思いますが、ケースバイケースだと思います。
ご回答、ありがとうございます。
確かに class A で値を保持してやれば、ソースの書き換えもそんなに大変じゃなさそうですよね!
もしくは class A を継承するクラスで返したいデータをメンバに追加して返すという方法も・・・。
この方法が一番コード変更が少なそうなので、今回はとりあえず「>ケースバイケース」というお言葉もあるので、#2さんの方法でやってみようと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングのペーパーテスト 実行結果を表示せよ #include <stdio.h> int h 1 2022/07/09 15:27
- JavaScript javascriptで文字分割は、 split() などメソッド不要??? 4 2023/02/06 22:50
- Windows 10 バッチファイルの記述法とルールについてアドバイスをお願いいたします。 1 2022/04/13 10:50
- HTML・CSS 全部のアクセスを指定したページに転送させたい 2 2022/06/28 16:33
- XML XML同じ名前の要素を自動で集約するツール 1 2022/04/11 09:21
- C言語・C++・C# プログラミングのペーパーテスト 実行結果がどのように表示されるか答えよ #include <stdi 1 2022/07/09 14:27
- JavaScript JavaScriptで「〇以上▲まで」の書き方 1 2022/07/20 14:44
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- JavaScript ifreamをリロードしたい 1 2022/05/03 16:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
レコード件数の表示
-
abstract と static を一緒に付...
-
Java初級 引数に適用できません
-
readLine()ではじめから読み直...
-
なぜprotected overrideなのか
-
Google Apps Script で getRang...
-
public static void main (Stri...
-
C# 点の描き方をおしえてくだ...
-
Jakarta POI での、excelのシ...
-
String.containsの反対機能はあ...
-
クラスを継承した際のコード自...
-
C言語での文字列より値を抜き出す
-
StringBufferからStringへキャ...
-
Fileの読み取り専用の解除
-
C# でメソッドに送られてきたOb...
-
Java初心者です、エラーの意味...
-
ArrayList の継承について(初...
-
YYYYMMDD書式の日付に対する適...
-
別クラスのmainメソッドの実行
-
クラスを作るとメソッドの数が...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Java初級 引数に適用できません
-
String.containsの反対機能はあ...
-
なぜprotected overrideなのか
-
Strutsでチェックボックスの値...
-
Google Apps Script で getRang...
-
abstract と static を一緒に付...
-
C# 点の描き方をおしえてくだ...
-
レコード件数の表示
-
public static void main (Stri...
-
StringBufferからStringへキャ...
-
YYYYMMDD書式の日付に対する適...
-
C# でメソッドに送られてきたOb...
-
シェルスクリプトからのJavaメ...
-
C# の ByVal と ByRef について
-
Fileの読み取り専用の解除
-
CSVから読み込んだデータの保持...
-
メソッドの引数に指定されてい...
-
javaに"search"という関数 or ...
-
Javaのメモリの管理
-
Java初心者です、エラーの意味...
おすすめ情報