java - 有 'many' 个子类时 INSTANCEOF 的替代实现

标签 java instanceof

我曾尝试寻找合适的解决方案,但很难找到。

这是一个非常简单的问题 - 如果我们想要确定一个类的类型,而该类的实例有很多,是否有使用 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/

相关文章:

jpa - 如何知道一个类是否是@Entity(javax.persistence.Entity)?

java - 试图理解同步队列的机制

java - 列表对象引用在 Java 循环期间更改

java - hibernate 标准 API : get n random rows

java - 在数组中创建 JButton 时出错

java - android套接字连接更新图形

php - 检查某物是否是 ArrayCollection 的实例

javascript - 在 Javascript 中实现 isInstance

java - 检查对象是否是 protected 类的实例

java - 检查子类时出现 "instanceOf"错误