代码美学:减少if多层嵌套的方法
// 微波炉加热案例
class MicrowaveOven {
private String state = State.DoorClosed;
public void open() {
if (state.equals(State.Heating)) {
System.out.println("加热中,不能开门");
} else if (state.equals(State.DoorClosed)) {
this.state = State.DoorOpen;
} else if (state.equals(State.DoorOpen)) {
System.out.println("门已开");
}
}
public void close() {
if (state.equals(State.Heating)) {
System.out.println("加热中,门已关");
} else if (state.equals(State.DoorClosed)) {
System.out.println("门已关");
} else if (state.equals(State.DoorOpen)) {
this.state = State.DoorClosed;
}
}
public void heating() {
if (state.equals(State.Heating)) {
System.out.println("加热中");
} else if (state.equals(State.DoorClosed)) {
this.state = State.Heating;
} else if (state.equals(State.DoorOpen)) {
System.out.println("开门状态,禁止加热");
}
}
}
1、使用卫语句(提前返回)
/**
* 1、使用卫语句优化
*/
public void open() {
if (state.equals(State.Heating)) {
System.out.println("加热中,不能开门");
return;
}
if (state.equals(State.DoorClosed)) {
this.state = State.DoorOpen;
return;
}
if (state.equals(State.DoorOpen)) {
System.out.println("门已开");
return;
}
}
2、使用设计模式解决,面向对象
不同动作中存在对不同状态的if校验,可以使用状态模式优化,优化如下:
/**
* 2、使用状态模式解决
*/
abstract class MicrowaveState {
public MicrowaveOvenForState microwaveOvenForState;
public MicrowaveState() {
}
public MicrowaveState(MicrowaveOvenForState microwaveOvenForState) {
this.microwaveOvenForState = microwaveOvenForState;
}
public abstract void open();
public abstract void close();
public abstract void heating();
}
class OpenState extends MicrowaveState {
public OpenState(MicrowaveOvenForState microwaveOvenForState) {
super(microwaveOvenForState);
}
@Override
public void open() {
System.out.println("门已开");
}
@Override
public void close() {
this.microwaveOvenForState.microwaveState = this.microwaveOvenForState.closeState;
}
@Override
public void heating() {
System.out.println("开门状态,禁止加热");
}
}
class CloseState extends MicrowaveState {
public CloseState(MicrowaveOvenForState microwaveOvenForState) {
super(microwaveOvenForState);
}
@Override
public void open() {
this.microwaveOvenForState.microwaveState = this.microwaveOvenForState.openState;
}
@Override
public void close() {
System.out.println("门已关");
}
@Override
public void heating() {
this.microwaveOvenForState.microwaveState = this.microwaveOvenForState.heatingState;
}
}
class HeatingState extends MicrowaveState {
public HeatingState(MicrowaveOvenForState microwaveOvenForState) {
super(microwaveOvenForState);
}
@Override
public void open() {
System.out.println("加热中,不能开门");
}
@Override
public void close() {
System.out.println("加热中,门已关");
}
@Override
public void heating() {
System.out.println("加热中");
}
}
class MicrowaveOvenForState {
private MicrowaveState openState = new OpenState(this);
private MicrowaveState closeState = new CloseState(this);
private MicrowaveState heatingState = new HeatingState(this);
private MicrowaveState microwaveState = this.openState;
public void open() {
this.microwaveState.open();
}
public void close() {
this.microwaveState.close();
}
public void heating() {
this.microwaveState.heating();
}
}
3、链式编程
public void lian() {
Position[] positions = new Position[6];
positions[0] = new Position(1, "Soft engineer", 3000, "广州");
positions[1] = new Position(2, "Soft engineer", 99000, "北京");
positions[2] = new Position(3, "Soft engineer", 2000, "上海");
positions[3] = new Position(4, "Web Developer", 5000, "上海");
positions[4] = new Position(5, "Soft engineer", 55000, "承德");
positions[5] = new Position(6, "Soft engineer", 3200, "上海");
List<Integer> result = Arrays.stream(positions).filter(o -> o.name.contains("Soft"))
.filter(o->"北京, 上海, 广州".contains(o.jobLocation))
.sorted((o1, o2) -> o2.salary - o1.salary)
.map(o -> o.id)
.limit(3)
.collect(Collectors.toList());
result.forEach(o -> System.out.println(o + ", "));
}
4、Optional空值判断转链式
String city = Optional.ofNullable(positions[0]).map(o -> o.jobLocation).orElse("");