簡體   English   中英

通過不可變繼承重用方法

[英]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類中為IPAddressPhysicalAddress重用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.

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