Как позволить методу вернуть более одного объекта? - PullRequest
1 голос
/ 14 сентября 2011

Это, наверное, очень глупый вопрос. Но есть ли способ, чтобы метод мог вернуть более одного объекта? Как, скажем, 2 строки?

public static String multipleReturnMethod(){

   String a = "a";
   String b = "b";

   return a;
   return b;
}

возможно? Невозможно? Как вы делаете возможным?

Ответы [ 8 ]

6 голосов
/ 14 сентября 2011

Вы можете вернуть массив ...

public static String[] multipleReturnMethod(){    
   String a = "a";
   String b = "b";
   return new String[] { a, b };
}

Или список, или тип, который инкапсулирует два значения и т. Д. *

Вы можете вернуть только одно значение из метода, но само это значение может дать доступ к нескольким «подзначениям».

Если вы сможете дать больше информации о том, что вы пытаетесь сделать, возможно, мы сможем помочь вам больше.

3 голосов
/ 14 сентября 2011

Невозможно без изменения возвращаемого объекта:

  1. Либо создайте для него класс:

    class Strings {
        String a, b;
        Strings(String a, String b) {
            this.a = a;
            this.b = b;
        }
    }
    
    public static Strings multipleReturnMethod(){
         return new Strings("a", "b");
    }
    
  2. Или вернуть массив

    public static String[] multipleReturnMethod(){
        return new String[] { a, b };
    }
    
1 голос
/ 14 сентября 2011

Если все они относятся к одному и тому же типу объектов, то самый простой способ - просто вернуть массив объектов этого типаобъекты.

public static ArrayList<Object> methodB(){
  ArrayList<Object> temp = new ArrayList<Object>();
  // do work
  return temp;
}
1 голос
/ 14 сентября 2011

Если вы хотите сохранить подпись, вы можете объединить строки с определенным разделителем:

public static final String DELIMITER = "\t";  // or something else 
                                              // not used in strings

public static String multipleReturnMethod(){

   String a = "a";
   String b = "b";

   return a + DELIMITER + b;
}

(хотя я предпочитаю изменить подпись и вернуть массив или коллекцию значений, см. Ответ Джона)

0 голосов
/ 14 сентября 2011

Если у вас есть более сложный пример, вы можете использовать шаблон слушателя

interface ResultListener {
   void resultOne(String text);
   void resultTwo(String text, int number);
}

public static void multipleReturnMethod(ResultListener result){
   result.resultOne("a");
   result.resultOne("b");
   result.resultTwo("C", 1);
}

Как вы можете видеть, вы можете возвращать вызывающему абоненту любую комбинацию результатов со смесью или комбинацией типов.

0 голосов
/ 14 сентября 2011

Невозможно вернуть более одного объекта, никогда! Решение состоит в том, чтобы вернуть объект, содержащий объекты, которые вы хотите вернуть.

0 голосов
/ 14 сентября 2011

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

FunctionalJava имеет удобный класс P для Product, который делает это легко. http://functionaljava.googlecode.com/svn/artifacts/3.0/javadoc/fj/P.html

return P.p(a,b);
0 голосов
/ 14 сентября 2011

Один из способов - передать объект вывода в ваш метод, например, в виде массива, так что это будет что-то вроде:

public static ArrayList<String> multipleReturnMethod(ArrayList<String> output) {

 String a = "a";
 String b = "b";

 output.add(a);
 output.add(b);
 return output; //not really necessary
}

Конечно, вывод должен быть создан вне вашего метода.

...