На самом деле вы не можете делать то, что пытаетесь сделать в Java, поскольку, как вы говорите, Java не поддерживает выходные параметры.
Параметры метода являются локальными переменными, поэтому при назначении имникакого эффекта вне рамок метода.Другими словами, это:
public void foo(Object obj) {
obj = new Object();
}
фактически эквивалентно (с точки зрения кода, вызывающего foo (Object)), как это:
public void foo() {
Object obj = new Object();
}
Бессмысленно, так как созданообъект будет отброшен, как только foo()
вернется.
Вероятно, вы хотите изменить свой метод так, чтобы он возвращал объект, который создает ваш метод:
public ClassA myMethod() {
ClassA obj = ....
...
return obj;
}
Затем в вашем вызывающем коде:
ClassA objA = myMethod();
if (objA != null) {
...
}
В качестве альтернативы, вы можете создать экземпляр ClassA вне вашего метода и передать это значение и заставить метод каким-либо образом изменить его:
public boolean myMethod(ClassA obj) {
obj.setValue(...);
return true;
}
...
ClassA objA = new ClassA();
if (myMethod(objA) {
Object val = objA.getValue();
...
}
Не зная большеЧто касается вашей конкретной проблемы, трудно сказать, какой дизайн лучше.
ОБНОВЛЕНИЕ:
Добавленный вами многопараметрический пример, к сожалению, совершенно невозможен.Все говорят, что java - это передача по ссылке, но на самом деле это больше похоже на передачу по ссылке.Метод может модифицировать объекты , переданные ему, но он не может изменить то, на что ссылаются переменные в вызывающей области.Если вы пришли из фона C ++, ссылки на объекты в java больше похожи на указатели (без арифметики указателей), чем на ссылки на C ++.
Чтобы сделать это более конкретным, рассмотрим следующий класс:
public class ParameterPassing {
public static void setParams(Integer value1, Integer value2) {
System.out.println("value1 before: " + value1);
System.out.println("value2 before: " + value2);
value1 = new Integer(1);
value2 = new Integer(2);
System.out.println("value1 after: " + value1);
System.out.println("value2 after: " + value2);
}
public static void main(String[] args) {
Integer valNull = null;
Integer val0 = new Integer(0);
System.out.println("valNull before: " + valNull);
System.out.println("val0 before: " + val0);
setParams(valNull, val0);
System.out.println("valNull after: " + valNull);
System.out.println("val0 after: " + val0);
}
}
Когда вы запустите это, вы получите следующий вывод:
valNull before: null
val0 before: 0
value1 before: null
value2 before: 0
value1 after: 1
value2 after: 2
valNull after: null
val0 after: 0
Как видите, назначения внутри метода setParams()
не влияют на то, что valNull
и val0
см.
Если вам действительно нужно несколько «выходных» параметров для одного метода, вам придется обернуть их в какой-то другой объект или переосмыслить свой дизайн.Возможно, вы могли бы сделать ссылки на переменные-члены, а не на локальные, и сделать так, чтобы ваш метод изменил их напрямую:
public class MyClass {
private ClassA objA;
private ClassB objB;
...
private boolean initObjects() {
objA = ...;
objB = ...;
return true;
}
public void otherMethod() {
...
if(initObjects() {
// Use objA, objB
}
}
}