Java: избавиться от if если использовать универсальный - PullRequest
1 голос
/ 22 мая 2019

в моем коде я использовал много операторов if-else.Я узнал, что операторы if-else и switch не являются элегантным способом кодирования. Есть ли хороший способ реорганизовать следующий код?

Wall, Trap, Door и Floor являются подклассом 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();
}
...

, и есть ошибка компиляции

Метод move1 (Floor) в типеПлеер не применим для аргументов (плитка)

Я читал пост, в котором говорится, что универсальный тип может быть решением, но я не знаю, как его реализовать.

Ответы [ 2 ]

6 голосов
/ 22 мая 2019

Я узнал, что операторы if-else и switch не являются элегантным способом кодирования, есть ли хороший способ реорганизовать следующий код?

Одним из возможных решений является добавление абстрактного метода к Tile, назовем его action(). (Не стесняйтесь придумать более подходящее имя.) Тогда вы можете сделать nextTile.action() без оператора if. Затем переименуйте Floor.walk() в Floor.action() и аналогично другим специализированным методам для каждого подкласса Tile. Это дает дополнительное преимущество: вы можете создавать новые подклассы Tile, и move() сможет обрабатывать их без каких-либо изменений.

1 голос
/ 22 мая 2019

Ну, стиль зависит от языка. Вы можете смешать Java и Kotlin в одном проекте: https://kotlinlang.org/docs/tutorials/mixing-java-kotlin-intellij.html

Вы можете создать файл Kotlin в вашем существующем проекте Java с чем-то вроде этого (не проверено):

when (nextTile) {
   is Floor -> walk()
   is Wall -> block()
   is Trap -> Trap()
   is Door -> unlock()
   else -> throw IllegalArgumentException("Unknown expression")
}

Взгляните на

https://try.kotlinlang.org/#/Kotlin%20Koans/Introduction/Smart%20casts/Task.kt

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...