我曾尝试寻找合适的解决方案,但很难找到。
这是一个非常简单的问题 - 如果我们想要确定一个类的类型,而该类的实例有很多,是否有使用 INSTACEOF 的适当、有效的替代方法?
例如:
我们有一个父 Product
类
public abstract class Product {
public abstract String preview();
}
它有 3 个子类(Vinyl、Book 和 Video)
public class Vinyl extends Product {
@Override
public String preview() {
return "Playing a vinyl";
}
public class Book extends Product {
@Override
public String preview() {
return "Reading a book";
}
@Override
public String preview() {
return "Playing a video";
}
现在,我想根据每个产品类型检查它的预览方法返回值 - 当我们有 3 子类时,写起来非常清晰和整洁:
public class TestProduct {
List<Product> productList = new ArrayList<>();
public void preview(Product product) {
for (Product currentProduct : productList) {
String preview = currentProduct.preview();
if (product instanceof Book) {
Assert.assertEquals(preview, "Reading a book");
} else if (product instanceof Vinyl) {
Assert.assertEquals(preview, "Playing vinyl");
} else {
Assert.assertEquals(preview, "Playing video");
}
}
}
}
但如果我们没有 3 种产品,而是 100 种或更多呢?
将此 INSTACEOF
语句写 100 遍对我来说毫无意义。
有什么合适的、可扩展的方法吗?
最佳答案
这是使用 interface
的可能实现:
public interface class Product {
public void doSomething();
}
然后每个子类都必须实现自己的 doSomething()
public class Vinyl implements Product {
public void doSomething(){
System.out.println("Vinyl product");
}
}
public class Book implements Product {
public void doSomething(){
System.out.println("Book product");
}
}
public class Video implements Product {
public void doSomething(){
System.out.println("Video product");
}
}
然后
Product product = new Vinyl();
product.doSomething();
// prints on the console --> "Vinyl product"
实现接口(interface)产品的其他类也是如此。
无法实例化抽象类,这对您的情况没有帮助,这就是我使用接口(interface)的原因。
旁注:通常当您需要使用 instanceof
时,您可能使用了错误的设计。
关于java - 有 'many' 个子类时 INSTANCEOF 的替代实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38539236/