2016-04-15 46 views
6

我有一個場景,我想設置一個Boolean對象,然後在方法的後面的構造函數中使用它的booleanValue()。但是,對象的設置範圍不同。它被設置在一個方法中,該方法首先實例化對象。基於我對Java如何傳遞基元和對象參數以及在線閱讀多篇文章(如this)的理解,當一個對象被傳入一個方法時,其屬性通過引用傳遞,並且被調用方法的任何改變都應該反映在調用方法執行完成後調用方法。但是我注意到,當被調用方法完成時,那裏的任何更改都不會在調用方法中生效。java布爾值在被調用的方法中沒有改變

這裏是我的方案的快照:

private CustomObject1 callingMethod(){ 
    Boolean b = Boolean.TRUE; 
    List<CustomObject2> list = this.calledMethod(b); 
    //Create CustomObject1 with b.booleanValue() as one of the arguments in the constructor 
} 

private List<CustomObject2> calledMethod(Boolean b){ 
    ... 
    ... 
    if(condition){ 
     b = Boolean.FALSE; 
    } 
    ... 
    ... 
} 

通過代碼達到CustomObject創作b.booleanValue()始終是真實的時候,即使在callingMethod() if語句是真實的Boolean設置爲false在那個方法。

我不願意將調用方法的返回類型更改爲boolean,因爲它需要更改可能調用此方法的其他代碼位。目前他們只需要簽名更改,但返回類型的變化需要更多的工作,因爲需要維護邏輯(即填充列表,然後使用它進行操作)

回答

14

首先,Java中有很多關於參數傳遞的錯誤信息,比如「對象通過引用傳遞,原語通過值傳遞」,這是不是真的全部通過價值通過

您沒有在Java中通過引用傳遞對象,而是按值傳遞對象引用。 Boolean b不包含Boolean對象,它保存對Boolean對象的引用(指針)。

這裏有一個關於它的好文章:http://javadude.com/articles/passbyvalue.htm

其次,Boolean(像其他包裝對象,也String)是不可變對象。因此,對於一個不可變的對象,並且當它們被值傳遞(更好地說,它們的引用是通過值傳遞的),你無法實現你想要的東西。你需要有一個可變的對象,就像@rob提到的那樣。

或從Apache Commons Lang使用MutableBoolean

+1

該鏈接非常有見地。我鼓勵任何看到這個的Java程序員閱讀它。 –

2

問題是您正在爲calledMethod重新分配b。 calledMethod中的重新分配僅重新分配在該方法的參數列表中聲明的變量;它不會修改在調用者範圍內聲明的變量。

要做你想達到的目標,你可以將b轉換爲一個字段,或者創建一個MutableBoolean類,它允許你做類似b.setValue(false)的事情。

+0

爲什麼將b轉換爲字段可以使b在調用方法中改變調用方法? – user1169587

+1

如果將'b'轉換爲一個字段(即,它不再是一個參數,但對被調用方法可見),調用方法和被調用方法都引用相同的變量;而如果'b'是一個參數,則調用方法和調用方法引用2個不同的變量。 – rob

相關問題