[英]reuse methods through immutable inheritance
如果我有一個AddressBook
來存儲Items
:
public class AddressBook {
public void add(Item item) {
...
}
}
還有一個不變的IPAddress
public final class IPAddress {}
還有一個不變的PhysicalAddress
public final class PhysicalAddress {}
而潛在的父類Item
public final class Item {}
由於不可變對象無法擴展不可變類Item
,因此如何在AddressBook
類中為IPAddress
或PhysicalAddress
重用add
方法?
首先,您需要意識到Java中的“最終類”並不意味着不可變,而是“不可繼承”。 使用“ final”關鍵字的不可變性僅適用於變量(且僅在設置其初始值之后)。
如果希望Item是不可繼承的(最終類),並且還希望IPAddress和PhysicalAdress也是最終的,則可以使用接口。 (編輯:這兩個類不是最終的要求,只是想指出的是,您可以根據需要將它們保持為最終狀態,盡管正如其他人評論的那樣,您應該確保將其最終確定)。
您可以將Item更改為接口,並使IPAddress和PhysicalAddress實現該接口。
這樣,AdressBook實際上會添加類型為“ ItemInterface”的對象(助記符不好,但您會明白),只要您設法對所有Items進行通用操作抽象,就可以使用接口代替繼承。
例如
public interface ItemInterface{
public Object getItemValue();
public void setItemValue(Object value);
}
public final class IPAddress implements ItemInterface{
@Override
public Object getItemValue(){
...
}
@Override
public void setItemValue(Object value){
...
}
}
然后您可以執行以下操作:
public class AddressBook {
public void add(ItemInterface item) {
itemsList.add(item);
// or whatever other structure you use to store items
}
}
通常,隨着開發越來越復雜的代碼,對接口進行編程比嘗試繼續使用繼承變得更加有用。
這樣,每當需要在地址簿中添加另一種類型的條目時,都可以使其實現ItemInterface,並且理想情況下,您不必在AddressBook中更改一行,因為所有內容都是ItemInterface。
我認為,您可能混合了不可變的課程和期末課程
不可變對象表示創建后無法更改。 參見https://docs.oracle.com/javase/tutorial/essential/concurrency/immutable.html
誠然,不能繼承最終班級。 如果您真的想要繼承類,那么它不能是最終的。
但關鍵是,不可變的類不必是最終的。
將一個類標記為final表示無法擴展。 從根本上講,這意味着您認為該類是完美的,並且沒有人將需要(或能夠)擴展它或覆蓋更具體的子類中的任何行為。
一般來說,除非有充分的理由使用final類,否則應避免使用final類。
因為您不能擴展最終類,所以永遠不能在繼承層次結構的任何地方使用它,除非在最底層。
您確定您確實要使課程最終結業嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.