Подтвердить что ты не робот

Возвращать различные типы данных из метода в 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() i, придумав следующее решение.

создать вызов класса 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;
}

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

4b9b3361

Ответ 1

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

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

Ответ 2

Нет. Java-методы могут возвращать только один результат (void, примитив или объект), а создание класса struct -type, как это, именно так, как вы это делаете.

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

Ответ 3

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

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

Unit Test:

public class MultipleReturnTypeTest {

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

}

Ответ 4

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

Ответ 5

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

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

Ответ 6

подход, который вы приняли, хорош. Просто реализация может быть лучше. Например, 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 
}

Ответ 7

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

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

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

Ответ 8

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

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

Ответ 9

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

Ответ 10

Я знаю, что это поздно, но я подумал, что это будет полезно для того, кто придет искать ответ на этот вопрос. Вы можете использовать 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;
}

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

Ответ 11

Я просто хочу высказать свое мнение

Таким образом, вам нужно создать общий тип Return и реализовать его с помощью различных типов конкретных возвращаемых типов. Класс Service может создавать различные типы объектов конкретного класса и возвращать как универсальный тип.

public interface GenericReturnType{
    public static RETURN_TYPE enum{
        MACHINE, PERSON;    
    }
    public RETURN_TYPE getReturnType();
}

public class PersonReturnType implements GenericReturnType{
    // CONSTRUCTORS //

    // GETTRE AND SETTER //

    public RETURN_TYPE getReturnType(){
        return PERSON;
    }
    public String getAddress(){
        return something;
    }
}

public class MachineReturnType implements GenericReturnType{
    // CONSTRUCTORS //

    // GETTRE AND SETTER //

    public RETURN_TYPE getReturnType(){
        return MACHINE;
    }
    public String getManufatureName(){
        return something;
    }
}


public class TestService{
    public GenericReturnType getObject(// some input //){
        GenericReturnType obj ;
        if(// some code //){
            obj = new  PersonReturnType();
            // some code //
        }
        if(// some code //){
            obj = new  MachineReturnType();
            // some code //
        }
        return obj;
    }
}

public class TestDriver{
    TestService service = new TestService();
    GenericReturnType genObj = TestService.getObject(// some input //);
    if(genObj.getReturnType() == RETURN_TYPE.MACHINE){
        // SOME CODE // 
    }
    if(genObj.getReturnType() == RETURN_TYPE.PERSON){
        // SOME CODE // 
    }
}

Ответ 12

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

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

}