36
public static void main(String args[]) {
    myMethod(); // i am calling static method from main()
 }

.

public static ? myMethod(){ // ? = what should be the return type
    return value;// is String
    return index;// is int
}

myMethod()String および int 値を返します。したがって、これらの戻り値を取得main()して、次の解決策を思いつきました。

クラス呼び出しを作成するReturningValues

public class ReturningValues {
private String value;
private int index;

// getters and setters here
}

そしてmyMethod()以下のように変更。

 public static ReturningValues myMethod() {
    ReturningValues rv = new ReturningValues();
    rv.setValue("value");
    rv.setIndex(12);
    return rv;
}

今私の質問は、これを達成するためのより簡単な方法はありますか??

4

14 に答える 14

25

enum を使用してさまざまな戻り値の型を作成します。自動的に定義されません。その実装は、ファクトリ パターンのように見えます。

public  enum  SmartReturn {

    IntegerType, DoubleType;

    @SuppressWarnings("unchecked")
    public <T> T comeback(String value) {
        switch (this) {
            case IntegerType:
                return (T) Integer.valueOf(value);
            case DoubleType:
                return (T) Double.valueOf(value);
            default:
                return null;
        }
    }
}

単体テスト:

public class MultipleReturnTypeTest {

  @Test
  public void returnIntegerOrString() {
     Assert.assertTrue(SmartReturn.IntegerType.comeback("1") instanceof Integer);
     Assert.assertTrue(SmartReturn.DoubleType.comeback("1") instanceof Double);
  }

}
于 2015-09-09T19:00:41.867 に答える
18

いいえ。Java メソッドは 1 つの結果 ( void、プリミティブ、またはオブジェクト)のみを返すことができstructます。

ReturningValues注意として、次のように不変のようなクラスを作成することがよくあります。

public class ReturningValues {
    public final String value;
    public final int index;

    public ReturningValues(String value, int index) {
        this.value = value;
        this.index = index;
    }
}

これには、ReturningValuesスレッド間などで a を渡すことができるという利点があり、誤って同期が外れることを心配する必要はありません。

于 2013-08-09T06:12:11.170 に答える
7

一般に、最終的に返される値がわからない場合は、すべての戻り値のスーパークラスとして return-type を使用することを検討する必要があります。この場合、String または int を返す必要がある場合は、Object クラス (java で定義されているすべてのクラスの基本クラス) を返すことを検討してください。

ただし、このメソッドを呼び出す場所をinstanceof でチェックするように注意してください。そうしないと、ClassCastExceptionが発生する可能性があります。

public static void main(String args[]) {
        Object obj = myMethod(); // i am calling static method from main() which return Object
    if(obj instanceof String){
    // Do something
    }else(obj instance of Integer) {
    //do something else
     }
于 2013-08-09T06:13:19.627 に答える
3

あなたが取ったアプローチは良いです。ただの実装はより良い必要があるかもしれません。たとえば、 ReturningValues は明確に定義されている必要があり、 ReturningValues をimmutableにすることができればより適切です。

// this approach is better
public static ReturningValues myMethod() {
    ReturningValues rv = new ReturningValues("value", 12);
    return rv;
}


public final class ReturningValues {
    private final String value;
    private final int index;


    public ReturningValues(String value, int index) {
      this.value = value;
      this.index = index;
     }

} 

または、キーと値のペアがたくさんある場合は、HashMap を使用できます。

public static Map<String,Object> myMethod() {
  Map<String,Object> map = new HashMap<String,Object>();
  map.put(VALUE, "value");
  map.put(INDEX, 12);
  return Collections.unmodifiableMap(map); // try to use this 
}
于 2013-08-09T06:20:08.057 に答える
1

これが解決策の1つになる可能性があります。しかし、あなたの現在の解決策は十分です。また、現在のコードでは実行できない、新しい変数を追加してクリーンな状態に保つこともできます。

private static final int INDEX_OF_STRING_PARAM = 0;
private static final int INDEX_OF_INT_PARAM = 1;

public static Object[] myMethod() {
    Object[] values = new Object[2];
    values[INDEX_OF_STRING_PARAM] = "value";
    values[INDEX_OF_INT_PARAM] = 12;
    return values;
}
于 2013-08-09T06:12:51.657 に答える
0

@ruchiraウルの解決策はそれ自体が最善です.しかし、整数と文字列だけであれば、はるかに簡単でシンプルな方法でそれを行うことができると思います..

 class B {   
    public String myfun() {         
        int a=2;           //Integer .. you could use scanner or pass parameters ..i have simply assigned
        String b="hi";      //String
        return Integer.toString(a)+","+b; //returnig string and int with "," in middle          
    }       
}

class A {    
    public static void main(String args[]){

        B obj=new B();  // obj of class B with myfun() method  
        String returned[]=obj.myfun().split(",");
             //splitting integer and string values with "," and storing them in array   
        int b1=Integer.parseInt(returned[0]); //converting first value in array to integer.    
        System.out.println(returned[0]); //printing integer    
        System.out.println(returned[1]); //printing String
    }
}

お役に立てば幸いです.. :)

于 2013-08-09T06:57:31.013 に答える
0

最後に、戻り値の型の数が増えると、この種の実装が最善の方法でそれを行うため、私の方法の方が良いと思いました。

public static ReturningValues myMethod() {
ReturningValues rv = new ReturningValues();
rv.setValue("value");
rv.setIndex(12);
return rv;
}
于 2013-08-09T12:09:00.313 に答える
-1

メソッドのオーバーロードは、次のように便利です。

<code>
public class myClass 
{
    int add(int a, int b) 
    {
         return (a + b);
    }

    String add(String a, String b)
    {
         return (c + d);
    }

    public static void main(String args[]) 
    {
        myClass ob1 = new myClass);
        ob1.add(2, 3);
        //will return 5
        ob1.add("Hello, ", "World!");
        //will return Hello, World!
    }

}

于 2017-06-01T19:12:30.790 に答える