Есть ли «строгий» режим для отключения автоматического вызова c toString () в Kotlin? - PullRequest
0 голосов
/ 27 мая 2020

Я портирую очень строго типизированный Java API в Kotlin. Многие строки имеют разные значения, и я нахожусь в процессе создания более значимых типов. Я делал это раньше в Java, и я сильно возненавидел автоматизацию c 'toString' типов. Вот простой пример:

fun someMethod(protocol: String, host: String) {
    val connectionString = "$protocol:$host"
}

Протокол и хост могут быть представлены в виде строки, но принципиально отличаются друг от друга, поэтому я ввожу специфицированные c типы:

class Protocol(val definition:String)
class Host(val definition:String)

, а затем заменяю определения параметров:

fun someMethod(protocol: Protocol, host: Host) {
    val connectionString = "$protocol:$host"
}

Теперь код connectionString по-прежнему предполагает, что это две строки, которые можно объединить. Компилятор ни на что не жалуется, потому что он просто вызывает toString () для этих типов, и в результате всегда получается какая-то строка, но вполне может быть что-то вроде [Host@458ad742]

Но мне бы очень хотелось, чтобы здесь была какая-то ошибка типа или предупреждение. В прошлом я прибегал к выбрасыванию исключений RuntimeExceptions из toString, чтобы скрыть эти ситуации. Это довольно барбари c, и для меня ошибка времени компиляции намного лучше, чем ошибка времени выполнения.

Для меня красота сильных типов в том, чтобы знать эти проблемы перед запуском.

Итак : Кто-нибудь знает флаг компилятора / анализатор / линтер / IDE / incantation, чтобы найти их во время компиляции?

1 Ответ

1 голос
/ 27 мая 2020

Отключить это невозможно, вам придется заменить toString(), чтобы делать то, что вы хотите:

class Protocol(val definition:String) {
    override fun toString() = definition
}
...