каков рекомендуемый способ использования двойного удара Kotlin для элемента с нулевым классом

В kotlin, если переменная является нулевой, kotlin попросит либо использовать !! или проверьте значение null перед его использованием. В случае наличия члена класса с нулевым значением внутри класса, где бы ни было судейство этого члена, kotlin будет предупреждать об ошибке с возможностью обнуления.

class ClassWithNullableMemebr { Var nullableMember: OtherClass? = null; constructor (obj: OtherClass) { nullableMember = obj } fun foo() { nullableMember!!.doSomething() } fun getTheOtherClassMember : OtherClass { return nullableMember!! } } 

Если nullvalMember гарантированно инициализируется в конструкторе, как избежать использования !!.

В Java или на другом языке они могут проверять null один раз и бросать, если по дизайну член никогда не должен быть нулевым. Тогда внутри класса член будет просто ссылаться без беспокойства.

Кто-то предложил сделать

 if (nullableMember != null) { nullableMember!!.doSomething() } 

Это все равно понадобится !! даже после проверки, и это делает код не очень красивым.

Для этого случая действительно используется?. не сильно отличается от использования !! так как в конструкторе присваивается значение nullableMember, а функция return не может избежать !!.

Я думаю, если этот nullableMember гарантированно не равен null после создания экземпляра класса, используя! не следует рассматривать как плохой стиль кодирования. И нет другого способа избежать этого.

Есть ли у кого-нибудь предложение избегать использования «!!»? в таком случае?

Если вы уверены, что переменная будет иметь значение null-null, вы должны определить ее как not-nullable.

После этого существует два способа избежать предупреждения о компиляторе и инициализации переменной вида:

  1. Использование модификатора lateinit

lateinit var nullableMember: OtherClass

Обратите внимание, что если вы попытаетесь получить доступ к этой переменной до ее инициализации, будет выбрано исключение

  1. Использование делегата notNull ()

var nullableMember: OtherClass by Delegates.notNull ()

Различия между этими двумя можно найти здесь.

Если есть необходимость установить значение этой переменной на нуль где-то в коде, я боюсь, что вам придется использовать !! потому что нет лучшего способа сделать это.

Если nullvalMember гарантированно инициализируется в конструкторе

В вашем случае это не так. Он будет инициализирован, если вы вызываете вторичный конструктор, но у вас также есть первичный конструктор без параметров, который инициализирует его null .

И если в конструкторе гарантировано быть инициализировано непустым значением, то, как говорится в комментарии Оливера, он не должен быть нулевым! И это должно быть val если оно установлено только в конструкторе (включая вторичные) или в блоках init .

Т.е. этот класс должен быть упрощен до

 class ClassWithNullableMemebr(val nullableMember: OtherClass) { fun foo() { nullableMember.doSomething() } } 

Если он гарантированно будет инициализирован в конструкторе, то он не должен быть ничтоли.

Вы можете иметь:

 class ClassWithMember(val member: OtherClass) { fun foo() { member.doSomething() } }