《Effective Java》第17條,最小可變化性里面講到了不可變類,要實現(xiàn)一個不可變類,需要以下幾點(diǎn)規(guī)則:不要提供修改對象狀態(tài)的方法確保這個類不可被繼承所有屬性都為private final確保所有任何可變組件的互斥訪問可是仔細(xì)思考,我覺得。如果遵循了其他幾點(diǎn),類是可以被繼承的。書上和其他博客都說確保這個類不可被繼承是防止子類修改了某個對象并向上轉(zhuǎn)換以父類的形式傳遞。但是父類的所有屬性都為private的,子類是無法訪問的。父類中不包含修改對象的方法,即使有,也是private的如果是這樣,那為什么還需要不可繼承呢?可能有點(diǎn)咬文嚼字,但是不思考清楚為什么~就難受
1 回答

動漫人物
TA貢獻(xiàn)1815條經(jīng)驗 獲得超10個贊
"不可變類"不是一種語法現(xiàn)象,只是一種最佳實踐。
所謂最佳實踐,就是說推薦這么做,這么做比較好,而不是說必須這么做(否則不能編譯或者出錯)。
不可變類為什么說不允許繼承比較好呢,因為派生類的編寫者未必知道你的類要設(shè)計成不可變的,所以它可能派生你的類,引入破壞你這些原則的成員。
那么不可變類的派生類就是可變了。這可能不是你希望的。所以需要封閉掉,不允許派生。
當(dāng)然,你非要不遵頊這些原則(包括某一條別的原則)也不是不可以,只是這么做不是好的設(shè)計,或者(起碼某種條件下)達(dá)不到不可變的作用。
極端地說,所有屬性都不為private final,我就用public可以不可以,我作為調(diào)用者創(chuàng)建了對象,就不去修改了,不是也是不可變的么?如果你能相通這個問題,那么本質(zhì)上不允許繼承還是允許繼承,是一樣的道理。
添加回答
舉報
0/150
提交
取消