2013-08-09 16 views
20
public static void main(String args[]) { 
    myMethod(); // i am calling static method from main() 
} 

Javaのメソッドから異なるタイプのデータを返しますか?

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

myMethod()は、文字列と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; 
} 

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

+1

'Properties'や' HashMap'や 'List'を使うこともできますが、返す値が明白であるため、' ReturnValues'がより適切です。 – MadProgrammer

+0

インデックスと値はどのように関係していますか? –

答えて

0

最後に私は自分のやり方がより良いと思っています。なぜなら、戻り値の型が高くなると、この種の実装が最善の方法で行われるからです。

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

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はを気にせず、そのようなスレッド間のように、周りに渡すことができるという利点があります間違って物事を同期させることはありません。

+0

戻り値の型は、https://docs.oracle.com/javase/tutorial/java/javaOO/returnvalue.htmlのようにInterfaceでもかまいません。この場合、返されるオブジェクト/クラスはこのインタフェースを実装する必要があります。 – FaithReaper

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; 
} 
+0

これはうまくいくが、タイプセーフで読みにくい。 – chrylis

+0

@chrylisはい私は完全に同意します。私は、現在のコードを2〜3つの戻り値に限定して管理することができると述べました。しかし、タイプセーフで理解しやすいので、より良いものはOPによるものです。 –

3

は一般的に、あなたはすべての戻り値のスーパークラスとして復帰型を使用して検討すべきです。この場合、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 
    } 
1

あなたが取ったアプローチは良いです。 実装を改善する必要があるかもしれません。 たとえば、ReturningValuesはよく定義されていて、 ReturnableValuesをとすると、になります。

// 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 
} 
+0

'index'と' value'フィールドがプライベートである場合、それらにアクセスするためにゲッターを追加する必要があります。 – ndm13

0

それは自己は、それが唯一の整数と文字列我々についてであれば、私が思うbest.Butある@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 
    } 
} 

私はそれが役に立ったと思っています。:)

14

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; 
     } 
    } 
} 

単体テスト:あなたが探している

<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! 
    } 

} 

+0

私は個人的には、メソッドのような列挙型を使用するのが奇妙に見えると思います。もっとハックに似ています。 – AndroidDev

-1

メソッドのオーバーロードは、ここでは便利で のように来ることができます。 Map.Entry

public static Entry<Integer,String> myMethod(){ 
    return new SimpleEntry<>(12, "value"); 
} 

以降:

Entry<Integer,String> valueAndIndex = myMethod(); 
int index = valueAndIndex.getKey(); 
String value = valueAndIndex.getValue(); 

それは、キーと値を格納するだけのシンプルな2フィールドのデータ構造です。特別な処理、2つ以上のフィールドの格納、またはその他のフリンジケースの格納が必要な場合は、独自のクラスを作成する必要があります。それ以外の場合は、Map.EntryはJavaクラスのうちの1つで、これらの状況に最適です。

0

クラスがすでに存在している:

public class MultipleReturnTypeTest { 

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

} 
0

私はこれが遅いことを知っていますが、私は、これに対する答えを探しに来る人に役立つだろうと思っていました。 Bundleを使用すると、別のメソッドを作成せずに複数のデータ型値を返すことができます。私はそれを試み、完全に働いた。

Bundle myBundle = method(); 
String myString = myBundle.getString("myS"); 
String myInt = myBundle.getInt("myI"); 

方法:

public Bundle method() { 
    mBundle = new Bundle(); 
    String typicalString = "This is String"; 
    Int typicalInt = 1; 
    mBundle.putString("myS", typicalString); 
    mBundle.putInt("myI", typicalInt); 
    return mBundle; 
} 

PS:私はそれを実装するためにOKだかどうかわからないんだけど、あなたがメソッドを呼び出すあなたのMainActivityで

このように束ねてください、しかし私のために、それは完璧に機能しました。

関連する問題