kotlin - могу ли я переписать эту карту доступа, чтобы избавиться от `` !! ``? - PullRequest
0 голосов
/ 26 октября 2018

Допустим, у меня есть

enum class ConceptualPosition{
    A1,A2,A3,A4,A5,A6,A7,A8,
    B1,B2,B3,B4,B5,B6,B7,B8,
    C1,C2,C3,C4,C5,C6,C7,C8
}

И теперь я хочу построить график, в котором каждая позиция имеет узел.

import [...].domain.model.base.ConceptualPosition
import [...].domain.model.base.ConceptualPosition.*
import [...].domain.model.base.Node
import [...].domain.model.base.Node.MovableDirection.*

class MyGraph:Graph{
    private val internalPositions = mutableMapOf<ConceptualPosition, Node>()
    override val position by lazy {internalPositions.toMap().withDefault {
        throw IllegalArgumentException("position '$it' does not exist")
    }}

    init{
        //create nodes for all positions
        ConceptualPosition.values().forEach { internalPositions[it] = Node(it) }

        //now build graph
        position[A1]!!.connectBothWaysWith(position[A2]!!,RIGHT)
        position[A2]!!.connectBothWaysWith(position[A3]!!,RIGHT)
        [...]

    }
}

, поскольку у меня есть withDefault, который сразувыдает исключение, и поскольку Котлин правильно выводит тип position как Map<ConceptualPosition,Node>, я думаю, что могу быть вполне уверен, что если поиск не завершится неудачей, я получу из него ненулевое значение.

Очевидно, что Котлин не может сделать вывод, что это безопасно.

Могу ли я реорганизовать это (разумным образом), чтобы избавиться от !!?

1 Ответ

0 голосов
/ 26 октября 2018

Используйте Map.getValue вместо get:

position.getValue(A1).connectBothWaysWith(position.getValue(A2),RIGHT)

В качестве альтернативы, вы можете определить свою собственную версию withDefault с более точным типом возвращаемого значения (стандартная библиотека Kotlin делает эквивалент приватным ):

class MapWithDefault<K, V>(val map: Map<K, V>, val default: (K) -> V) : Map<K, V> by map {
    override fun get(key: K): V = map[key] ?: default(key)
}

fun <K, V> Map<K, V>.withDefault(default: (K) -> V) = MapWithDefault(this, default)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...