Возвращает другой тип данных из метода в java?

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

теперь мой вопрос,есть ли простой способ добиться этого??

11 ответов


нет. Методы Java могут возвращать только один результат (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 может передаваться, например, между потоками, без каких-либо опасений о случайном выходе вещей из синхронизации.


Я создаю различные типы возврата с помощью перечисления. Он не определяется автоматически. Эта реализация выглядит как фабричный шаблон.

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

}

Как правило, если вы не уверены, какое значение вы вернете, вы должны рассмотреть возможность использования 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
     }

Это может быть одним из решений. Но ваше нынешнее решение достаточно хорошо. Вы также можете добавить новые переменные и сохранить их чистыми, что невозможно сделать с помощью настоящего кода.

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

подход, который вы приняли, хорош. Просто реализация может быть лучше. Например, ReturningValues должны быть четко определены и Его лучше, если вы можете сделать ReturningValues как неизменяемые.

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

вы можете иметь возврат в качестве объекта. Вы создаете этот объект "на лету" в своем

function: if(int) 
 return new object(){
   int nr=..
}

то же самое для строки. Но я обеспокоен тем, что это дорогостоящее решение...


наконец, я подумал, что мой способ лучше, так как, когда количество возвращаемых типов повышается, этот вид реализации делает это наилучшим образом.

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

класс, который вы ищете, уже существует. 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();

Это просто два поля-это структура данных, которая хранит ключ и значение. Если вам нужно выполнить какую-либо специальную обработку, сохранить более двух полей или иметь какой-либо другой крайний случай, вы должны создать свой собственный класс, но в противном случае,Map.Entry является одним из наиболее недоиспользуемых классов Java и идеально подходит для таких ситуаций.


Я знаю, что это поздно, но я думал, что это будет полезно для кого-то, кто будет искать ответ на этот. Вы можете использовать Bundle для возврата нескольких значений типа данных без создания другой метод. Я попробовал и отлично сработал.

В вашей MainActivity, где вы вызываете метод:

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

P. S: Я не уверен, что это нормально для реализации такого пакета, но для меня это сработало отлично.


@ruchira ur решение это само лучше.Но я думаю, что если речь идет только о integer и string, мы можем сделать это очень легко и просто..

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

Я надеюсь, это было полезно.. :)


перегрузка метода может пригодиться здесь Например:

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

}