簡體   English   中英

為什么從Java和C#中刪除const?

[英]Why was constness removed from Java and C#?

我知道這已經討論了很多次,但我不確定我是否真的理解為什么 Java和C#設計者選擇從這些語言中省略這個功能。 我對如何制定變通方法(使用接口,克隆或任何其他替代方法)不感興趣,而是對決策背后的基本原理感興趣。

從語言設計的角度來看,為什么這個功能被拒絕了?

PS:我正在使用諸如“省略”之類的詞語,有些人可能覺得這些詞語不合適,因為C#是用加法(而不是減法)方法設計的。 但是,我使用這樣的詞是因為在設計這些語言之前C ++中存在這個特性,所以從程序員的工具箱中刪除它就省略了。

這次采訪中,安德斯說:

Anders Hejlsberg:是的。 關於const,它很有意思,因為我們也一直聽到這樣的抱怨:“為什么你沒有const?” 問題隱含的是,“為什么你沒有運行時強制執行的const?” 這正是人們所要求的,盡管他們並沒有這樣說出來。

const在C ++中工作的原因是因為你可以把它丟棄。 如果你不能把它扔掉,那么你的世界就會糟透了。 如果聲明一個采用const Bla的方法,則可以將它傳遞給非const Bla。 但如果它是相反的方式你不能。 如果聲明一個采用非const Bla的方法,則不能將它傳遞給const Bla。 所以現在你被卡住了。 所以你逐漸需要一個不是const的所有東西的const版本,你最終得到了一個陰影世界。 在C ++中,你可以使用它,因為與C ++中的任何東西一樣,無論你是否想要這個檢查,它都是純粹可選的。 如果你不喜歡它,你可以打破常量。

我猜主要是因為:

  • 它無法正確執行,即使在C ++中(你可以強制轉換)
  • 底部的單個const可以強制調用樹中的整個const鏈

兩者都有問題。 但特別是第一個:如果不能保證,它有什么用? 更好的選擇可能是:

  • 不可變類型(完全不變性或冰棒不變性)

至於他們為什么這么做,那些參與者都這么說:

雷蒙德也提到http://blogs.msdn.com/ericgu/archive/2004/04/22/118238.aspx http://blogs.msdn.com/slippman/archive/2004/01/22/61712.aspxhttp://blogs.msdn.com/oldnewthing/archive/2004/04/27/121049.aspx

在多語言系統中,這將非常復雜。

至於Java,你會如何表現這樣的屬性? 已經存在使對象不可變的技術,這可以說是通過額外的好處實現這一目標的更好方法。 實際上,您可以通過聲明僅實現不更改狀態的方法的超類/超接口來模擬const行為,然后使用實現變異方法的子類/子接口。 通過將可變類轉發到沒有寫入方法的類的實例,其他代碼不能修改對象而不將其專門地轉換回可變版本(這相當於拋棄const )。

即使你不希望對象是嚴格不可變的,如果你真的想要(我不推薦),你可以在它上面設置某種“鎖定”模式,這樣它只能在解鎖時進行變異。 將鎖定/解鎖方法設置為私有或適當保護,並在那里獲得某種級別的訪問控制。 或者,如果您不打算將該方法作為參數進行修改,則傳入該對象的副本,或者如果復制整個對象太重,那么其他一些輕量級數據對象只包含必要的信息。 您甚至可以使用動態代理為對象創建代理,將任何對變異方法的調用轉換為無操作。

基本上已經有很多方法可以防止類被突變,這讓你可以選擇一個最適合你情況的方法(提示:盡可能選擇純粹的不變性,因為它使對象簡單地線程安全並且通常更容易推理)。 沒有明顯的語義可以實現const是如何實現這些技術的改進,這將是另一件事,要么學習要么缺乏靈活性,要么靈活到無用。

也就是說,除非我錯過了什么,這是完全可能的。 :-)

Java有自己的const版本; 最后。 Joshua Bloch在他的Effective Java中描述了如何有效地使用final關鍵字。 (順便說一句,const是Java中的保留關鍵字,用於未來的差異)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM