2012-12-06 76 views
1

過去,我遇到了這個問題好幾次,所以我要求在這裏什麼是最好的做法Java函數的原始參照

我的過程,變爲真幾個對象,修改它們並上升一些標誌。

boolean erros = false; 
    for(MyData data: allData){ 
    //... 

     //@ToDo move this to a function titleCheck() 
     if(data.getTitle().isEmpty()){ 
      data.setTitle('none'); 
      erros = true; 
     } 

     if(data.getTitle().equals('BIG')){ 
      data.setTitle('small') 
     } 

     if(data.getTitle().equals('error')){ 
      errors = true; 
     } 

    //... 
    } 

我需要一個功能,所以首選的語法是這樣的更新數據,並更改一個或多個標誌 :

MyData updatedData = titleCheck(MyData data, &erros){...} 

但布爾值不能作爲參考,使他們爲傳遞它的工作原理是:

boolean errors = titleCheck(MyData dataForUpdate){...} 

女巫..方式不太直觀(至少對我來說......從PHP背景的) 問題變得更大如果你有幾個標誌要更新。

那麼..什麼是適當的Java方式來處理這樣的結構。

+6

*在Java中沒有任何引用通過*。 –

+0

在java中,所有東西都是按值傳遞的 – Abubakkar

+0

處理它的「正確」Java方法通常是您的第二個示例(您稱之爲不太直觀的示例)。還有其他一些你可以做的事情,比如將你的數據和你的布爾值放在一個容器對象中,並把它們放在一起,但是我認爲這樣會讀得更好。在許多方面,這是使用不同語言的代價,你根本無法總是按照習慣的方式去做事情。 – Thor84no

回答

3

當你這樣做:

titleCheck(MyData data); 

上面給出你的代碼,你實際上改變的是數據對象 - 這個副本。因此,您可以返回成功/失敗布爾值,並且不必返回傳遞的對象。所以現在你可以將這些值合在一起。

boolean error = false; 
error |= titleCheck(...); 
error |= nameCheck(...); 

如果你想傳遞對象和狀態回來了,你可以平凡從而宣告迴歸類:

class ReturnResult { 
    public boolean error; 
    public MyData data; 
} 

(我做了,因爲公共領域我用它作爲一個簡單的結構)。這種方法的優點是您可以利用面向對象將相關對象綁定在一起,並且可以將方法放在上面的類中,以便輕鬆地合併連續的結果。

最後我注意到你正在調用MyData對象上的很多方法,並確定該對象之外的成功/失敗。我寧願把這個MyData的對象。然後,MyData對象可以存儲自己的有效/無效狀態,您可以通過isValid()方法或類似方法詢問它自己的狀態。這似乎是在這裏做事情的一種非常OO的方法。

1

Java不支持通過引用。即使引用是按值傳遞的。

要做你建議你需要傳遞一個對象的引用,例如boolean[]AtomicBoolean,並用它來代替。