Интересно, как грамотнее писать проверку на то, что коллекция не пустая, следуя принципу чистого кода?
if(!col.isEmpty())
Или
if(col.size() > 0)
Или
if(col.get(0) != null)
Коварный восклицательный знак можно не заметить, однако на enSO где-то читал, что так лучше читается, но мне кажется, что наиболее читаем второй вариант.
Так, как все-таки лучше?
if(col.size() > 0)
и
if(col.get(0) != null)
вообще не вариант.
if(!col.isEmpty()) больше подходит, но как вы верно заметили оператор "!" часто можно не заметить, потому что наш мозг плохо работает с отрицанием. Из-за этого иногда трудно будет найти ошибку в коде.
Вы говорите о чистом коде. В таких ситуациях я часто, даже почти всегда пользуюсь рефакторингом, а точнее извлекаю это условие в метод (Extract method) и называю метод в зависимости от того какой коллекцией пользуюсь:
Например,
if(!children.isEmpty()) {
// do something
}
!children.isEmpty() ивлекаю в метод hasChildren().
if (hasChildren()) {
// do something
}
private boolean hasChildren() {
return !children.isEmpty();
}
Такой код лучше читается и не путает другого программиста который будет работать с вашим кодам.
Вот еще варианты:
!orders.isEmpty() -> hasOrders(). Если заказы пусты, значит ничего не заказывал(а).
!playlist.isEmpty() -> hasPlaylist(). Если пользователь вообще ничего не добавлял(а) в плейлист, значит у него (нее) нет плейлиста.
и т.д.
Во-первых, вы не указали еще вариант
if (col.isEmpty()) {
return ... // результат если коллекция пуста
} else {
... // результат если не пуста
}
Во-вторых, if(col.size() > 0) довольно некрасивый на мой взгляд, тем более что для строк и кастомных классов он не всегда подходит. К тому же кастомные коллекции могут быстро отдавать ответ isEmpty() и долго size(). Иметь один вариант для всех случаев предпочтительнее.
По уму нужно использовать col.isEmpty().
Плюсы тут не в производительности. Если заглянуть в исходники метода, то, скорее всего, вы сможете увидеть return size == 0;
Все обстоит немного иначе…
Начнем с того, что если писать код правильно и грамотно, то все классы предметной области должны взаимодействовать через их интерфейсы.
Это дает много плюсов, в т.ч. гибкость, ведь по сути, если класс А имеет дело с интерфейсом класса В, то класс А вообще ничего не знает о существовании класса В, вы можете с легкостью даже полностью заменить класс В, главное, чтобы он имплементировал те же интерфейсы.
Именно по этой причине, создавая новый экземпляр класса любой коллекции, мы приводим ее к интерфейсу Map map = new HashMap(). И вот тут самое интересное…
Теперь, вызывая isEmpty(), вы вообще-то обращаетесь к интерфейсу и вообще не привязаны к непосредственной реализации этого метода в классе, либо к каким-либо другим методам. Посему работает все вышесказанное.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости