在我的代码中,我使用了许多if-else语句。我了解到if-else和switch语句不是一种很好的编码方式,是否有很好的方法来重构以下代码?
墙壁,陷阱,门和地板是Tile的子类
public class Player{
...
public void move(DIR dir) throws Exception {
Position nextPos = checkMove(dir);
Tile nextTile = TileManager.getTileType(nextPos.getSeq());
if (nextTile instanceof Floor) {
walk();
} else if (nextTile instanceof Wall) {
block();
} else if (nextTile instanceof Trap) {
trap();
} else if (nextTile instanceof Door) {
unlock();
}
}
public void walk(){
...
}
public void block(){
...
}
public void trap(){
...
}
...
}
我试图通过方法重载来解决这个问题
public void move1(DIR dir) throws Exception {
Position nextPos = checkMove(dir);
System.out.println(nextPos);
Tile nextTile = TileManager.getTileType(nextPos.getSeq());
moveTo(nextTile);
}
public void moveTo(Floor next) throws Exception {
walk();
}
public void moveTo(Wall next) throws Exception {
block();
}
...
并且存在编译错误
Player类型的方法move1(Floor)不适用于 参数(瓷砖)
我读过一些文章,暗示通用类型可能是一种解决方案,但我不知道如何实现。
答案 0 :(得分:6)
我了解到if-else和switch语句不是一种很好的编码方式,有没有很好的方法来重构以下代码?
一种可能的解决方案是在Tile
上添加一个抽象方法,我们称之为action()
。 (随时提供更好的名称。)然后,您可以执行nextTile.action()
,而无需使用if
语句。然后将Floor.walk()
重命名为Floor.action()
,并使用类似的方法将每个Tile
子类的其他专用方法重命名。这样做的另一个好处是,您可以创建新的Tile
子类,而move()
将能够对其进行处理而无需进行任何更改。
答案 1 :(得分:1)
嗯,样式取决于语言。您可以在一个项目中混合使用Java和Kotlin: https://kotlinlang.org/docs/tutorials/mixing-java-kotlin-intellij.html
您可以在现有Java项目中使用类似以下内容(未经测试)创建Kotlin文件:
{{1}}
看看
https://try.kotlinlang.org/#/Kotlin%20Koans/Introduction/Smart%20casts/Task.kt