偽命題:Java傳遞的值還是引用?
Java引數傳值還是傳引用?
Java按值傳遞與引用傳遞?
JAVA值傳遞還是引用傳遞?
初學者經常被這個問題搞得頭暈腦脹,甚至它還成為程式設計師面試的經典試題,但是在我個人看來,這個問題本身存在誤導,如同媽和老婆落水你先救哪個一樣,這個問題能夠成立的條件並不是在Java語言這個邊界內。
實際上這個問題是:
Java(或其他語言)能否提供值傳遞或引用傳遞?
語言平臺除了這兩種傳遞方式之外,是否需要其他傳遞方式?
要回答這兩個問題,我們需要從OO松耦合和DDD分析設計這個高度來回答。
之前我寫了兩篇文章:
1. 松耦合角度:依賴注入和事件程式設計,提出瞭如果因為兩個類因為方法呼叫,而必須將這兩個類實現引用關聯,這是一種因為區域性利益造成整體依賴緊耦合的短視做法。
2.聚合根與Bounded Context角度:使用依賴注入實現聚合根之間呼叫的邏輯悖論,DDD提供了一套統一語言和方法,讓我們對需求領域切分成一個個Bounded context,這些上下文場景孕育了聚合根,有名乃萬物之母,不能有超越有界上下文邊界的聚合存在,而如果將兩個聚合根(聚合群的頭)使用引用聚合在一起,這本身實則是混淆了上下文邊界,Evans認為在上下文之間重用程式碼是一件非常冒險的,更何況我們透過引用表達這種緊耦合關係。
既然引用是把雙刃劍,如此簡單卻又是造成緊耦合的元兇,那麼是不是應該慎重使用呢?每次用Java程式設計時,該使用引用+依賴注入,還是考慮使用別的方式替代呢?
值+ 事件訊息 可以替代引用+依賴注入。
比如原來引用+依賴注入的程式碼:
如果BacklogItem和Product兩個類之間只是一種方法依賴,也就是說,BacklogItem需要呼叫Product方法,那麼我們就沒有必要使用設計模式這種結構模式(組合模式),而應該考慮行為模式(觀察者模式等),因為這種引用實現的組合模式導致兩個類結構上的依賴,正好誤用了結構型模式。
透過值+ 事件訊息(觀察者模式)可以替代如下:
既然我們的設計意圖是使用事件訊息,那麼我們就要拷問作為設計工具的Java,你能實現這樣的事件訊息嗎?
Java只能說:不能直接實現。
而
Scala或Erlang說:I can, 用Actor即可
如果下次再有人問你:Java傳遞的是值還是引用。
你可以反問:傳你個妹啊,你怎麼不問Java能夠傳遞訊息嗎?
Java按值傳遞與引用傳遞?
JAVA值傳遞還是引用傳遞?
初學者經常被這個問題搞得頭暈腦脹,甚至它還成為程式設計師面試的經典試題,但是在我個人看來,這個問題本身存在誤導,如同媽和老婆落水你先救哪個一樣,這個問題能夠成立的條件並不是在Java語言這個邊界內。
實際上這個問題是:
Java(或其他語言)能否提供值傳遞或引用傳遞?
語言平臺除了這兩種傳遞方式之外,是否需要其他傳遞方式?
要回答這兩個問題,我們需要從OO松耦合和DDD分析設計這個高度來回答。
之前我寫了兩篇文章:
1. 松耦合角度:依賴注入和事件程式設計,提出瞭如果因為兩個類因為方法呼叫,而必須將這兩個類實現引用關聯,這是一種因為區域性利益造成整體依賴緊耦合的短視做法。
2.聚合根與Bounded Context角度:使用依賴注入實現聚合根之間呼叫的邏輯悖論,DDD提供了一套統一語言和方法,讓我們對需求領域切分成一個個Bounded context,這些上下文場景孕育了聚合根,有名乃萬物之母,不能有超越有界上下文邊界的聚合存在,而如果將兩個聚合根(聚合群的頭)使用引用聚合在一起,這本身實則是混淆了上下文邊界,Evans認為在上下文之間重用程式碼是一件非常冒險的,更何況我們透過引用表達這種緊耦合關係。
既然引用是把雙刃劍,如此簡單卻又是造成緊耦合的元兇,那麼是不是應該慎重使用呢?每次用Java程式設計時,該使用引用+依賴注入,還是考慮使用別的方式替代呢?
值+ 事件訊息 可以替代引用+依賴注入。
比如原來引用+依賴注入的程式碼:
public class BacklogItem{ Product product; } <p class="indent"> |
如果BacklogItem和Product兩個類之間只是一種方法依賴,也就是說,BacklogItem需要呼叫Product方法,那麼我們就沒有必要使用設計模式這種結構模式(組合模式),而應該考慮行為模式(觀察者模式等),因為這種引用實現的組合模式導致兩個類結構上的依賴,正好誤用了結構型模式。
透過值+ 事件訊息(觀察者模式)可以替代如下:
public class ProductVO { private long productId; private long name; private String description; } public class BacklogItem{ private ProductVO productVO; void dosth(){ //向Product聚合根發事件訊息實現呼叫 domainevents.send(new ProductUpdatedEvent(productVO.getProductId)); } } <p class="indent"> |
既然我們的設計意圖是使用事件訊息,那麼我們就要拷問作為設計工具的Java,你能實現這樣的事件訊息嗎?
Java只能說:不能直接實現。
而
Scala或Erlang說:I can, 用Actor即可
如果下次再有人問你:Java傳遞的是值還是引用。
你可以反問:傳你個妹啊,你怎麼不問Java能夠傳遞訊息嗎?
[該貼被banq於2013-04-17 10:30修改過]
[該貼被admin於2013-04-17 12:32修改過]
相關文章
- Java - 是值傳遞還是引用傳遞Java
- 解惑4:java是值傳遞還是引用傳遞Java
- Java引數傳遞是傳值還是傳引用?Java
- 搗漿糊的老話題:Java是按值傳遞還是按引用傳遞Java
- Java是值傳遞還是引用傳遞,又是怎麼體現的Java
- JS是按值傳遞還是按引用傳遞?JS
- 面試官:兄弟,說說Java到底是值傳遞還是引用傳遞面試Java
- Java 是傳值還是傳引用 (轉)Java
- 面試官問:Go 中的引數傳遞是值傳遞還是引用傳遞?面試Go
- java經典問題:傳值還是傳引用(轉)Java
- Java的值傳遞和引用傳遞Java
- Go語言引數傳遞是傳值?還是傳引用 ?Go
- Go語言引數傳遞是傳值還是傳引用Go
- Java中的值傳遞和引用傳遞Java
- 188W+程式設計師關注過的問題:Java到底是值傳遞還是引用傳遞?程式設計師Java
- go語言引數傳遞到底是傳值還是傳引用Go
- 你會swap嗎,按值傳遞還是按引用?
- 關於String是值傳遞還是引用傳遞,talk is cheap, just show codes
- 值傳遞與引用傳遞
- 值傳遞和引用傳遞
- JavaScript的值傳遞和引用傳遞JavaScript
- java方法中只有值傳遞,沒有引用傳遞Java
- Java 從陣列來看值傳遞和引用傳遞Java陣列
- 快速搞懂值傳遞與引用傳遞
- Day30--值傳遞和引用傳遞
- 關於值傳遞和引用傳遞的解釋
- 這一次,徹底解決Java的值傳遞和引用傳遞Java
- Python 函式中,引數是傳值,還是傳引用?Python函式
- ES5中的值傳遞/引用傳遞--解釋
- 這一次,讓你徹底理解Java的值傳遞和引用傳遞!Java
- chan中傳遞map資料,傳遞的是引用
- golang工作筆記(二)值傳遞與引用傳遞Golang筆記
- [精]--這一次,讓你徹底明白Java的值傳遞和引用傳遞!Java
- 這裡是值引用還是指標引用?指標
- C#程式設計引用型別和值型別 以及引用傳遞和值傳遞C#程式設計型別
- 這是個技術偽命題
- java值傳遞Java
- js中函式引數值傳遞和引用傳遞JS函式