В Java, если у меня есть иерархия классов, например, так:
private interface Foo { }
private class FooBar implements Foo { }
private class FooZoo implements Foo { }
И тогда у меня есть функция, подобная этой:
public int Return0IfFooBarElseIfFooZooReturn1ElseReturn2(Foo foo) {
if (foo instanceof FooBar) {
return 0;
} else if (foo instanceof FooZoo) {
return 1;
} else {
return 2;
}
}
Во время выполнения отражение будет использоваться для определения типа foo
. В идеальном мире нам бы хотелось, чтобы в нашем коде не использовалось отражение. Кроме того, насколько я знаю, в Java нет способа создать иерархию закрытых типов, а это значит, что вам всегда нужно будет предоставить ветку else для компиляции кода.
Однако в Kotlin вы можете создать иерархию закрытых типов, например, так:
sealed class Foo {
object FooBar : Foo()
object FooZoo : Foo()
}
И затем вы можете написать выражение when для включения типа и возврата значения следующим образом:
fun return0IfFooBarElseReturn1(foo: Foo) = when (foo) {
is Foo.FooBar -> 0
is Foo.FooZoo -> 1
}
В этом есть интересное свойство; а именно, else
не требуется, потому что выражение when
исчерпывающе проверяет иерархию запечатанных типов. Итак, из этого свойства может ли компилятор получить достаточно информации для компиляции байт-кода, который каким-то образом не будет использовать отражение во время выполнения, чтобы определить, имеет ли переданный экземпляр заданный тип?
Или другими словами, есть ли какая-либо разница (в отношении отражения) во время выполнения между кодом Kotlin выше и кодом Kotlin ниже:
interface Foo
class FooBar : Foo { }
class FooZoo : Foo { }
fun return0IfFooBarElseReturn1(foo: Foo) = when (foo) {
is FooBar -> 0
else -> 1
}
Я спрашиваю об этом, потому что, как правило, мы, программисты, будем нравится избегать размышлений (где это возможно), но официальные документы Kotlin для закрытых классов показывают пример включения экземпляра с использованием is
(https://kotlinlang.org/docs/reference/sealed-classes.html). Я также делаю это справедливо в коде, который я делаю на работе, и хотя я не вижу никаких проблем с этим, некоторые коллеги высказывают опасения, поскольку это похоже на запах кода.