第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

合理的“實例”?將其與接口一起使用,但不與實現(xiàn)類型一起使用

合理的“實例”?將其與接口一起使用,但不與實現(xiàn)類型一起使用

DIEA 2023-10-12 17:13:21
當代碼中包含 Javainstanceof操作符時,很多人都會皺起眉頭并說這是禁忌。例如:請注意,如果您必須經(jīng)常使用該運算符,通常表明您的設計存在一些缺陷。因此,在設計良好的應用程序中,您應該盡可能少地使用該運算符(當然,該一般規(guī)則也有例外)。不過,沒有進一步詳細說明什么時候可以使用instanceof,什么時候不行。我對此進行了一些思考,并闡明了以下指導方針。我認為這可能在互聯(lián)網(wǎng)上的某個地方討論過,但我找不到。因此這個問題并征求您的評論:instanceof在接口上使用是可以的;instanceof在實現(xiàn)上使用是不行的這是&ldquo;好的&rdquo;案例的示例。示例:動物目錄,其中一些(但不是全部)可以飛Animal.javapublic interface Animal {? ? String getName();? ? String makeNoise();}CanFly.javapublic interface CanFly {? ? float getMaxInAirDistanceKm();}Cat.javapublic class Cat implements Animal {? ? @Override? ? public String getName() {? ? ? ? return "Cat";? ? }? ? @Override? ? public String makeNoise() {? ? ? ? return "meow";? ? }}BaldEgale.javapublic class BaldEagle implements Animal, CanFly {? ? @Override? ? public String getName() {? ? ? ? return "BaldEagle";? ? }? ? @Override? ? public String makeNoise() {? ? ? ? return "whistle";? ? }? ? @Override? ? public float getMaxInAirDistanceKm() {? ? ? ? return 50;? ? }}Catalog.javaimport java.util.ArrayList;import java.util.List;public class Catalog {? ? private List<Animal> animals = new ArrayList<>();? ? public void putAnimal(Animal animal) {? ? ? ? animals.add(animal);? ? }? ? public void showList() {? ? ? ? animals.forEach(animal -> {? ? ? ? ? ? StringBuilder sb = new StringBuilder();? ? ? ? ? ? sb.append(animal.getName() + ": ");? ? ? ? ? ? sb.append(animal.makeNoise() + " ");? ? ? ? ? ? // this block exemplifies some processing that is?? ? ? ? ? ? //? ?specific to CanFly animals? ? ? ? ? ? if (animal instanceof CanFly) {? ? ? ? ? ? ? ? sb.append(String.format(" (can stay in air for %s km)",? ? ? ? ? ? ? ? ? ? ? ? ((CanFly) animal).getMaxInAirDistanceKm()));? ? ? ? ? ? }? ? ? ? ? ? System.out.println(sb.toString());? ? ? ? });? ? }
查看完整描述

3 回答

?
鴻蒙傳說

TA貢獻1865條經(jīng)驗 獲得超7個贊

我認為人們認為總是有一個“更干凈”的解決方案來產(chǎn)生你想要的行為。


在您的示例中,我想說,使用 Visitor 設計模式在不使用 instanceOf 的情況下執(zhí)行完全相同的操作:


public interface Animal {

    String getName();

    String makeNoise();

    void accept(AnimalVisitor v);

}


public interface AnimalVisitor() {

    void visit(Cat a);

    void visit(BaldEagle a);

}


public interface CanFly {

    float getMaxInAirDistanceKm();

}


public class Cat implements Animal {

    void accept(Visitor v) {

        v.visit(this);

    }

}


public class BaldEagle implements Animal, CanFly {

    void accept(Visitor v) {

        v.visit(this);

    }

}


public class DisplayVisitor implements AnimalVisitor  {

    void visit(Cat a) {

       //build & display your string

    }


    void visit(BaldEagle a) {

       //build & display your string

    }

}


public class Catalog {

    private List<Animal> animals = new ArrayList<>();


    public void putAnimal(Animal animal) {

        animals.add(animal);

    }


    public void showList() {

        DisplayVisitor display = new DisplayVisitor();

        animals.forEach(a->a.accept(display));

    }

}

instanceOf雖然我沒有完全回答你的問題,但它表明在大多數(shù)情況下,只需以 OOP 方式思考并使用已知模式即可完成相同的行為,而無需使用。


查看完整回答
反對 回復 2023-10-12
?
子衿沉夜

TA貢獻1828條經(jīng)驗 獲得超3個贊

首先,需要注意的是,面向對象編程范式是抵制類型檢查(例如instanceof. 其他范例不一定有這種阻力,甚至可能鼓勵類型檢查。所以這個問題只有在你嘗試進行 OOP 時才有意義。

如果您嘗試進行 OOP,那么您應該盡可能多地利用多態(tài)性。多態(tài)性是 OOP 的主要武器。類型檢查是多態(tài)性的對立面。

當然,抽象的類型檢查優(yōu)于具體實現(xiàn)的類型檢查;但這只是重申依賴倒置原則(依賴于抽象,而不是具體)。

在 OOP 中,每次使用類型檢查都可以被視為錯失了多態(tài)性的機會。


查看完整回答
反對 回復 2023-10-12
?
白衣染霜花

TA貢獻1796條經(jīng)驗 獲得超10個贊

不過具體什么時候使用還可以就不再詳細說明instanceof

這不是對您問題的直接回答,但我想說,instanceof只有當所有其他選項都不可行時,這才合適。

instanceof在接口上使用是可以的;instanceof在實現(xiàn)上使用是不行的

我將其重新表述為“instanceof在接口上使用比在實現(xiàn)上使用要好instanceof”,但這只是強耦合不好這一一般規(guī)則的推論。通常有更好的選擇。

當你想使用時instanceof,你應該首先考慮引入額外的接口或接口方法或使用訪問者模式。所有這些選項都是在 Java 中實現(xiàn)所需行為的更簡潔的方法。

這并不總是優(yōu)雅的,并且可能需要人工接口或導致接口膨脹,這就是為什么其他一些語言支持臨時聯(lián)合類型和代數(shù)數(shù)據(jù)類型的原因。但這instanceof都不是一個好的模擬方法,因為 Java 的類型系統(tǒng)無法幫助您確保處理所有可能的選項。


查看完整回答
反對 回復 2023-10-12
  • 3 回答
  • 0 關注
  • 144 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號