Read this answer для Java 8, все это говорит также относится к Котлину:
Дополнение, сделанное на языке Java не оказывает каждое старое понятие устаревшим. Фактически, шаблон посетителя очень хорош в поддержке добавления новых операций.
Это относится к Kotlin. Подобно Java 8, он имеет Lambdas, SAM conversions и interfaces that allow default implementations.
Одно изменение, если вы делаете экземпляр класса проверки типа, вместо того чтобы использовать большое if
заявление для каждого instanceof
проверки, используйте when
expression в Котлин:
На той же странице StackOverflow в другом ответе он говорит о том, Lambdas используется и показывает if
заявление в Java, определяющее, какую лямбду позвонить. Вместо того, чтобы их Java sample:
if (animal instanceof Cat) {
catAction.accept((Cat) animal);
} else if (animal instanceof Dog) {
dogAction.accept((Dog) animal);
} else if (animal instanceof Fish) {
fishAction.accept((Fish) animal);
} else if (animal instanceof Bird) {
birdAction.accept((Bird) animal);
} else {
throw new AssertionError(animal.getClass());
}
Используйте этот Котлин:
when (animal) {
is Cat -> catAction.accept(animal)
is Dog -> dogAction.accept(animal)
is Fish -> fishAction.accept(animal)
is Bird -> birdAction.accept(animal)
else -> throw AssertionError(animal.javaClass)
}
В Котлин вам не нужно бросать так как smart cast автоматически сделан, когда компилятор видит is
проверку типа экземпляра.
Также в Котлин вы можете использовать Sealed Classes представлять ваши возможные варианты в иерархии, а затем компилятор может определить, если вы исчерпали все случаи означает, что вы не нуждаетесь в else
в when
заявлении.
В противном случае то, что верно на этой странице, и другие распространенные ответы на один и тот же вопрос - хорошая информация для Kotlin. Я не думаю, что так же часто можно увидеть фактический образец буквенного посетителя в Java 8, Scala или Kotlin, но, скорее, некоторые вариации, использующие lambdas и/или сопоставление шаблонов.
Прочие связанные статьи:
Вы просите кого-то, чтобы написать шаблон посетителя образец для Котлин от вашего имени? Вопрос широкий, открытый и, вероятно, должен быть помечен для закрытия. –
Нет, я просто спрашиваю, как идиоматически реализовать конкретный образец на языке, который я все еще изучаю - вот и все. – Max
Опубликуйте свое лучшее предположение, и дайте нам помочь вам настроить его. Вероятно, вы просто передадите лямбду узлам, которые пройдут и вызовут лямбду с посещенным узлом. Начните там, отправьте код, затем мы сможем помочь оттуда. –