Java:通过使用泛型类型摆脱其他情况

时间:2019-05-22 17:22:15

标签: java generics

在我的代码中,我使用了许多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)不适用于   参数(瓷砖)

我读过一些文章,暗示通用类型可能是一种解决方案,但我不知道如何实现。

2 个答案:

答案 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

https://kotlinlang.org/docs/reference/typecasts.html