Java:泛型、继承和最佳设计

问题描述 投票:0回答:1

我有一个基本的处理界面:

public interface Processing<T> {
    void appendTo(T t);
}

还有这个继承树:

public class Animal {
}

public class Dog extends Animal {
    public void forDog() {}
}

public class Cat extends Animal {
    public forCat() {}
}

这是关于动物加工的。我有两个解决方案。哪一种是最好的图案?

解决方案 A(使用仿制药):

public abstract class AbstractProcessing<T extends Animal> implements Processing<T> {
    protected void internalAppend() {}
}

public class CatProcssing extends AbstractProcessing<Cat>{

    @Override
    public void appendTo(Cat cat) {
        cat.forCat();
        internalAppend();
    }
}

public class DogProcessing extends AbstractProcessing<Dog>{
    
    @Override
    public void appendTo(Dog dog) {
        dog.forDog();
        internalAppend();
    }
}

解决方案B:

public class AnimalProcessing implements Processing<Animal>{
    @Override
    public void appendTo(Animal animal) {
        if (animal instanceof Cat cat) {
            cat.forCat();
        } else if (animal instanceof Dog dog) {
            dog.forDog();
        } else {
            throw new IllegalArgumentException();
        }
        internalAppend();
    }

    private void internalAppend() { }
}
java oop generics inheritance design-patterns
1个回答
0
投票

类型检查是一种代码味道,因为它打破了开闭原则。因此不推荐第二种解决方案。

在第一个解决方案中,为什么需要“internalAppend”?应该避免它,因为它不会向设计添加任何内容,“appendTo”方法就足够了。

© www.soinside.com 2019 - 2024. All rights reserved.