如何消除initmethod中的重复代码

how to eliminate duplicate code in initmethod

我有 类 狗、猫、... 扩展 Pet 和 init 方法。如果init方法必须为void,如何消除重复代码。

public class Tester {
    private Pet pet1;
    private Pet pet2;
    private int i;

    public void pet1Init(){
        switch (i){
            case 0:
                pet1 = new Cat();
                break;
            case 1:
                pet1 = new Dog();
                break;
            .....
        }
    }

    public void pet2Init(){
        switch (i){
            case 0:
                pet2 = new Cat();
                break;
            case 1:
                pet2 = new Dog();
                break;
            .......
        }
    }
}

我给你一个方案,不改你的设计,看看有多别扭:

public void pet1Init(){
    pet1 = getPet().get();
}

public void pet2Init(){
    pet2 = getPet().get();
}

private Supplier<Pet> getPet() {
    Supplier<Pet> supplier = Cat::new; // default pet

    switch (i){
        case 0:
            supplier = Cat::new;
            break;
        case 1:
            supplier = Dog::new;
            break;
    }

    return supplier;
}

更简洁的解决方案使用 Map<Integer, Supplier<Pet>>:

private Map<Integer, Supplier<Pet>> map = Map.of(0, Cat::new, 1, Dog::new);

private Supplier<Pet> getPet() {
    return map.getOrDefault(i, Cat::new);
}

不过,目前还不清楚您要实现的目标。这些变量可以在一个方法中初始化,因为它们共享相同的算法:

public void initialisePets(){
    final Supplier<Pet> supplier = getPet();

    pet1 = supplier.get();
    pet2 = supplier.get();
}