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 方式思考并使用已知模式即可完成相同的行為,而無需使用。

TA貢獻1828條經(jīng)驗 獲得超3個贊
首先,需要注意的是,面向對象編程范式是抵制類型檢查(例如instanceof
. 其他范例不一定有這種阻力,甚至可能鼓勵類型檢查。所以這個問題只有在你嘗試進行 OOP 時才有意義。
如果您嘗試進行 OOP,那么您應該盡可能多地利用多態(tài)性。多態(tài)性是 OOP 的主要武器。類型檢查是多態(tài)性的對立面。
當然,抽象的類型檢查優(yōu)于具體實現(xiàn)的類型檢查;但這只是重申依賴倒置原則(依賴于抽象,而不是具體)。
在 OOP 中,每次使用類型檢查都可以被視為錯失了多態(tài)性的機會。

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)無法幫助您確保處理所有可能的選項。
添加回答
舉報