如何消除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();
}
我有 类 狗、猫、... 扩展 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();
}