Создание двух объектов внутри метода для использования в качестве «возвращаемых значений» - PullRequest
2 голосов
/ 01 октября 2010

У меня есть следующий класс:

public class Matriz
{
  ...
  static public void create(Matriz a, Matriz b)
  {
     ...
     a=new Matriz(someValue,anotherValue);
     b=new Matriz(someValue,anotherValue);    
     ...
  }
}

И в моем основном методе:

public static void main(String[] args)
{
  Matriz a=null,b=null;
  Matriz.create(a,b);
  //these are null
  a.print();
  b.print();
}

Смысл моего метода create () в том, чтобы "вернуть" два Matrizобъекты.Как я мог это сделать?

Ответы [ 6 ]

3 голосов
/ 01 октября 2010

Вот несколько предложений:

1) Вернуть список из них:

public List<Matriz> create(..);
...
List<Matriz> matrizList = Matriz.create(...);
a = matrizList.get(0);
b = matrizList.get(1);

2) Вернуть метод Object

public MatrizHolder create(...);
...
MatrizHolder holder = Matriz.create(...);
a = holder.getA();
b = holder.getB();

3) Создайте их по одному

public Matriz create(...);
...
a = Matriz.create(..);
b = Matriz.create(..);

Кроме того, вы не можете передать пустую ссылку на метод, инициализировать его в методе и сохранить ссылку после завершения метода. Следовательно, передача a и b методу create в приведенном выше коде не имеет смысла.

2 голосов
/ 01 октября 2010

Либо вернуть массив из двух:

public static Matriz[] create(..) {

   ...
   return new Matriz[] {a, b};
}

или ввести новый класс -

class MatrizPair {
   private Matriz a;
   private Matriz b;

   // setter and getter for each
}

Важно отметить, что ваш пример не работает, потому что java является «передачей по значению», а не «передачей по ссылке» (читай this )

2 голосов
/ 01 октября 2010

Самый простой способ - просто вернуть массив:

static public Matriz[] create()
{
    ...
    Matriz[] m = new Matriz[2];
    m[0] = new Matriz(someValue, anotherValue);
    m[1] = new Matriz(someValue, anotherValue); 
    ...
    return m;
}
1 голос
/ 01 октября 2010

Во-первых, вы не должны передавать объекты, которые хотите создать.Просто верните массив.

Так ваш код будет выглядеть так:

public class Matriz
{
  ...
  static public Matriz[] create()
  {
     ...
     a=new Matriz(someValue,anotherValue);
     b=new Matriz(someValue,anotherValue);    
     ...
     return new  Matriz[] {a, b};
  }
}

И ваш основной метод:

public static void main(String[] args)
{
  Matriz[] array = Matriz.create();
  array[0].print();
  array[1].print();
}
1 голос
/ 01 октября 2010

Подобные вещи не будут работать в Java, потому что Java вызывает по значению, а не по ссылке.

Что вы можете сделать, если хотите, чтобы эта функция работала, это передать в метод контейнер любого типа (массив, Коллекция , AtomicReference и т. Д., Но вы можете не делайте это просто с помощью переменной. Переменная копируется при передаче в метод, поэтому исходное значение не может быть изменено методом. Если вы передадите контейнер, вы можете вставить значение из метода, и это будет видно из исходного контекста, потому что внешний метод указывает на тот же объект контейнера (ссылки копируются, а значения нет).

0 голосов
/ 01 октября 2010

Вы не можете вернуть два объекта. Вы можете вернуть только массив или коллекцию объектов. В вашем случае вы можете создавать переменные в качестве полей класса и назначать им что-то в методе 'create'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...