2014-02-27 48 views
1

我想實現的是這樣的:爪哇 - 傳遞一個指向對象的功能

MyClass object = null; 
doStuff(&object); 

// `object` can now be non-null 

目前我做的這是什麼,但我認爲必須有一個更好的方式來實現這種行爲在Java中:

MyClassPointer pointer = new MyClassPointer(null); 
// pointer.object is null 
doStuff(pointer); 

// pointer.object can now be non-null 
+0

看看[這裏](http://stackoverflow.com/questions/21274346/how-can-you-extend-java-to-introduce-passing-by-reference)。 –

+0

'MyClass object = doStuff()'怎麼樣? –

+0

Java中沒有指針。實現某種形式的「out」或「by ref」調用語義的唯一方法是* mutate *作爲參數提供的對象 - 如後一種情況所示。我建議讓'doStuff'簡單*返回一個有用的(複合)值。 – user2864740

回答

2

要「參觀」如果你真的想doStuff返回兩個值:有可能是一個更好的方式來設計這個。不過,如果你已經決定,爲doStuff返回兩個值確實是最好的設計,可以用一個簡單的輔助類完成:

static class MyClassAndBoolean { 
    public MyClass obj; 
    public boolean b; 
    public MyClassAndBoolean(MyClass obj, boolean b) { this.obj = obj; this.b = b; } 
} 

,然後改變doStuff的返回類型爲MyClassAndBoolean。這是我認爲在一個班上的公共領域是好的極少數情況之一。既然你定義了一個簡單的類來作爲函數的結果,而不是代表一個連貫的概念,那麼關於定義訪問器而不是暴露字段的常見問題並不適用。 (PS我只猜到boolean對於其他類型的,但它可以是任何東西,當然。)

另一個解決方法:

MyClass[] obj = new MyClass[1]; 
result = doStuff(obj); 

變化doStuff的參數類型爲MyClass[],並且有它的東西了新對象分成parameter[0]。我確實看到了一些Java和Android庫方法中使用的習慣用法。

0

爲什麼不乾脆:

MyClass object = doStuff(); 

這是更直觀恕我直言。否則,您必須將引用(不是指針!)傳遞給您的方法的容器對象,如您所識別的那樣。這在Java世界中不是一種常見的模式。

+0

'doStuff()'具有不同的返回值。將函數想象爲返回兩個值,一個直接通過返回,另一個通過這個黑客。 –

+2

doStuff()也許doTooMuch()?我相信這將是微不足道的解決一些上下文。 –

+1

你有133k的聲望,請不要告訴我,你不能想到一個函數有多個返回值... –

0

據我所知,它是唯一的方法來做到這一點。 但是你可以簡單地在你的課堂上實施方法。而且在你的方法中也有可能返回你的對象。

public MyObject myFunction(){ 
//do stufff... 
return new MyObject(); 
} 
MybObject object = myFucntion(); 

或者你可以用你的方式做到這一點。同樣使用反射,你可以調用你的方法。

Method method = foo.getClass().getMethod("doSomething", null); 
method.invoke(foo, null); 
0

不,沒有更好的方法,因爲在Java中沒有像C++那樣使用指針的方式。

在Java引用中(很像C++中的指針)不能直接訪問,並且總是按值傳遞。因此你不能在一個方法中改變引用的值。

0

使用Visitor pattern,你MyClass的是有什麼用dostuff

+0

這與「訪客模式」無關。 – ajb

+0

如果它沒有任何關係,那麼它可能會:如果它傳遞一個參考來收集doStuff中的一些數據呢? – robermann