Как правильно проверить наличие нулевых значений в обнуляемых инфиксных приемниках? - PullRequest
0 голосов
/ 30 января 2019

У меня отключена инфиксная функция Kotlin:

private fun statementMeetsConditions(policy: PolicyStatement, per: PolicyEnforcementRequest): Boolean {
    return policy.conditions areMetBy per.attributes
}

private infix fun JsonNode?.areMetBy(attributes: Map<String, String>): Boolean {
    if (this == null) return true //no conditions, so we pass

    TODO("Condition-based policies not implemented")
}

Во время выполнения policy.conditions равно нулю.

enter image description here

Я бы подумал, что (this == null) будет иметь значение true, однако я запускаю исключение времени выполнения, когда инфиксная функция попадает в TODO.

Это обе функции-члены в классе - поэтому яПодозреваю, что «this» оценивает экземпляр класса ( не null), а не JsonNode?, который я ожидал.Как я могу гарантировать, что я ссылаюсь на JsonNode? вместо класса?

Ответы [ 3 ]

0 голосов
/ 30 января 2019

NullNode ( jackson-databind-javadoc ) не является null ;-) NullNode на самом деле является его собственным типом ... Так что вы можете вместо этого захотеть проверить этот тип...

Проверка того, работает ли this на null, работает на infix функциях так, как вы ожидаете, даже если эти функции расширения заключены в класс.

Итак, чтобы проверить,ваш policy.conditions содержит то, что NullNode вы можете вместо этого изменить условие на следующее:

if (this is NullNode) return true
0 голосов
/ 31 января 2019

Это на самом деле немного сложно.Обратите внимание, что значение условия равно "null", а не null.Это связано с тем, что

toString() из ValueNode вызывает asText() из NullNode, что возвращает String значения "null", поэтому получатель JsonNode? фактически не был нулевым все время.

Итак, как уже говорил Роланд, вы должны проверить, относится ли получатель к типу NullNode.

0 голосов
/ 30 января 2019

Эта нулевая проверка хороша как есть, вы правы в том, что в этом случае она проверяет обнуляемый получатель JsonNode?.

Однако метод TODO в Kotlinвзрывной todo, поскольку в нем всегда выбрасывается NotImplementedException, когда его ударили.Вот почему этот код разрешено компилировать, хотя не все ветви возвращают значение Boolean из метода.

...