У меня супер странное поведение из кода, который я тестировал. Тест, который я написал, состоял в том, чтобы увидеть поведение класса, если Android вернул пустое имя пакета. После некоторой отладки я обнаружил это (учтите, что packageName empty ):
val resultFromKotlin = packageName.isNullOrEmpty()
val resultFromJava = StringUtils.isEmpty(packageName)
Это ожидается? Может кто-нибудь сказать, что с этим делать?
ps1 .: На рисунке выше Android Studio жаловалась на isNullOrEmpty
, говоря, что это можно упростить, поскольку packageName
не может быть нулевым в этой точке.
пс2 .: Для справок:
Класс StringUtils
написан на Java следующим образом:
public static boolean isEmpty(String str) {
return str == null || TextUtils.isEmpty(str.trim());
}
TextUtils также является froJavava, но он является частью библиотеки Android:
public static boolean isEmpty(@Nullable CharSequence str) {
return str == null || str.length() == 0;
}
Вот как kotlin реализует свой метод расширения:
public inline fun CharSequence?.isNullOrEmpty(): Boolean {
contract {
returns(false) implies (this@isNullOrEmpty != null)
}
return this == null || this.length == 0
}
РЕДАКТИРОВАТЬ 08/11/2018 :
Просто для пояснения, моя проблема в неправильном значении, возвращаемом из Java, а также в поиске эквивалентности в тесте: