プロが教える店舗&オフィスのセキュリティ対策術

例えば、他のクラスのメソッドに何らかのインスタンス配列を渡してやって、その中から何らかの基準で選択して要素を返すようなメソッドを考えます。
さらに、同時に配列のどの位置が選ばれたのかを知りたい場合は、みなさんならばどう対処しますか?

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 から返す方法か・・くらいです。

みなさんならこういった場合(メソッドにより取得したい値がいっぱいある場合)
、どうしますか?

A 回答 (4件)

メソッドで複数の値を取得したい場合、次の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);
    • good
    • 0
この回答へのお礼

ご回答、ありがとうございます。
なるほど、ということは別にクラスを設けるという方法がスマートということなんですね。
ソースまで下さってありがとうございますm(_ _)m
bean の意味がちょっと気になりますが、大変参考になりました!

お礼日時:2005/12/30 10:27

ちょっといまいち実現したい機能と方針がつかめないのですが、



>メソッドにより取得したい値がいっぱいある場合、どうしますか?

という部分を質問と考え答えます。Javaもしくはオブジェクト指向では、必ずしも結果の値を返す必要はありません。呼び出すメソッドを持つオブジェクトが保持していればいいのです。

例えばHogeSelectorというクラスがあり、selectというメソッドがあったとします。戻り値はvoidです。で、selectを呼び出したあとに、HogeSelectorのインスタンスは呼び出されたあとの状態を保持し、get…というメソッドいくつかの種類の状態を取得することができるという感じ。どうでしょう?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

> ちょっといまいち実現したい機能と方針がつかめないのですが
ちょっと分かりにくかったですよね、ごめんなさい。
自分はまだオブジェクト指向になれていないせいもあってこのような疑問が出てきたのかもしれませんが、
例えば、C言語で,
int test(a, &b, &c, &d, &e, &f);
という呼び出しにおいて、一度の関数呼び出しで b, c, d, e, f に値を保持、もしくは変更することが可能ですよね。
それにかわる Java で一般的な方法 があれば知りたいなという意図があって質問してみました。

>呼び出すメソッドを持つオブジェクトが保持していればいいのです。
これは #2さんと似た方法ですよね。
この考えもちゃんと頭に入れて、ケースバイケースでうまく使い分けられたらいいなぁと思います。

早くオブジェクト指向に慣れたいですね(苦笑

お礼日時:2005/12/30 10:54

ポインタをイメージしているのであれば


新しい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;
 }
}
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。

やはり、オブジェクトを作ってやらないと、参照渡しみたいなことはできないんですね。(当然ですが・・)
こちらの方法も大変参考になりました。
これならば、戻り値を変更しないで、class SampleBean を追加するだけで済みそうですよね.

#1 さんのご回答でもそうでしたが、Bean という言葉が気になるので、それについては調べてみます。

お礼日時:2005/12/30 10:40

質問者のおっしゃる方法以外では、


class Aの方で、選択した位置(最後にselectした時の状態)を保持するというのもあるかと思います。
一般的には、複数の値を返す必要が有る場合には、そのようなオブジェクトを返すのがいいかと思いますが、ケースバイケースだと思います。
    • good
    • 0
この回答へのお礼

ご回答、ありがとうございます。
確かに class A で値を保持してやれば、ソースの書き換えもそんなに大変じゃなさそうですよね!
もしくは class A を継承するクラスで返したいデータをメンバに追加して返すという方法も・・・。

この方法が一番コード変更が少なそうなので、今回はとりあえず「>ケースバイケース」というお言葉もあるので、#2さんの方法でやってみようと思います。

お礼日時:2005/12/30 10:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!