你不能真正做你想在java中做什麼,因爲如你所說,java不支持輸出參數。
方法參數是局部變量,因此賦值給它們在方法範圍之外沒有任何作用。換句話說,這樣的:
public void foo(Object obj) {
obj = new Object();
}
實際上等效(從視圖的代碼調用foo的(對象)的點),因爲這:
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();
...
}
不知道更多關於您的具體問題,很難說哪種設計更好。
UPDATE:
所添加的多參數的例子是平展不可能在Java中,不幸的是。大家都說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
}
}
}
進出口你最後一個例子混淆使用。它是否顯示如果我爲對象的實例分配內存,那麼當我將它來回傳遞時,它實際上是在同一實例上運行?所以我唯一的問題是,在將它傳遞給myMethod之前,我實例化爲null? – 2011-02-23 19:19:51
有一種使用Ref參數的方法,使用'java.util.concurrent.atomic'工具集來包裝對象。畢竟,完全有可能接收現有的對象,並且只是改變它的內部屬性**。一個函數可以_edit_一個對象,但是如果你嘗試_replacing_,那麼你只能通過引用一個新對象來替換你的局部變量。它不以任何方式影響原始對象;你在這個時候就停止使用它。 – Nyerguds 2011-06-29 06:32:56