Javanese Online
Open in Telegram
Статьи и новости, наблюдения и советы. Кодревью: http://javanese.online/%D1%80%D0%B0%D0%B7%D0%B1%D0%BE%D1%80_%D0%BA%D0%BE%D0%B4%D0%B0/ Обсуждение в @javanese_questions Материалы пишет @Harmonizr
Show more723
Subscribers
No data24 hours
+37 days
+530 days
Posts Archive
Если вам достался многофункциональный хитрозакрученный класс, удалите всё, что не используется.
Если потом что-то из удалённой функциональности понадобится — напишете нормально, качественно и понятно.
The Well-Grounded Java Developer
Очень рекомендую эту книгу. Содержит обзор фич из Java 7 (
@SafeVarargs, MethodHandle, invokedynamic, NIO 2), введение в альтернативные JVM-языки (Groovy, Scala, Clojure), обзор популярных инструментов (Maven, Jenkins, FindBugs, Checksyle и т. д.). Разжёвывает некоторые (хорошо забытые многими) возможности Java.
http://javanese.online/%D1%81%D1%82%D0%B0%D1%82%D1%8C%D0%B8/%D1%80%D0%B5%D0%BA%D0%BE%D0%BC%D0%B5%D0%BD%D0%B4%D1%83%D0%B5%D0%BC%D1%8B%D0%B5_%D0%BA%D0%BD%D0%B8%D0%B3%D0%B8/#The_Well-Grounded_Java_DeveloperВопросы по Kotlin, которые я задавал бы на собеседовании. Мало кто ответит на все из них внятно и технически корректно, но понимать, как всё работает, я считаю, нужно обязательно.
Спасибо @yushkaDD, которая спровоцировала меня на создание этой подборки.
http://javanese.online/%D1%81%D1%82%D0%B0%D1%82%D1%8C%D0%B8/kotlin_%D1%81%D0%BE%D0%B1%D0%B5%D1%81_%D0%B2%D0%BE%D0%BF%D1%80%D0%BE%D1%81%D1%8B/
Тут Oracle рассказывают, как синглтоны делать.
https://community.oracle.com/docs/DOC-918906
> The class in Listing 1 seems correct, but it has some imperfections because it immediately loads the instance of the class when the application starts even if the instance is not needed.
То есть статьи на сайте Oracle пишут люди, слабо понимающие, как загружаются классы. Техническое ревью? Вычитка перед публикацией? Не, не слышали.
Там даже два года назад оставили комментарий, указывающий на бессмысленность всей статьи:
https://community.oracle.com/docs/DOC-918906#comment-991352
Нет, я понимаю, что нужно быть добрее к людям, ведь все мы совершаем ошибки. Но это официальный сайт создателей языка.
Кажется, именно из-за таких мелочей мы получаем кучу программистов, которые что-то где-то прочитали, в деталях не разобрались и теперь пишут ужасающий код.
Я часто говорю о том, что из-за многословности JSON можно использовать только для малых объёмов данных, а из-за отсутствия схемы — только в пределах маленькой команды адекватных уравновешенных людей. Но сейчас не об этом.
Так как ключи в объектах — это строки, в JSON очень много кавычек. А в XML кавычки — escape-символы. Это значит, что если в XML положить JSON (Android-разработчики сейчас вспомнили
SharedPreferences), каждая кавычка превратится в ", а размер JSON резко вырастет.Ещё одно наблюдение про билдеры. Классический билдер на кодревью (вне IDE) помогает понять, что происходит. Без билдера эту же роль могут выполнять локальные переменные.
http://javanese.online/%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D1%8B_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D1%8B/builder/#%D0%B8%D0%BC%D0%B5%D0%BD%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5_%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D1%8B
Совет от Google: засуньте null-безопасность всюду, пишите всё с вопросиками. Удачной отладки!
В IDEA есть рефакторинг «Replace Constructor with Builder». Хотелось бы также иметь противоположный.
http://javanese.online/%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D1%8B_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D1%8B/builder/
Должны ли DTO быть изменяемыми?
http://javanese.online/%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D1%8B_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D1%8B/immutable_DTO/
Очень часто вижу мучения фронтов, связанные с тем, что бэк возвращает ответ, завёрнутый в какой-то мусор. Вот один из способов прозрачно развернуть такой ответ при использовании Retrofit.
https://youtu.be/t34AQlblSeE?t=27m56s
Синглтоны хороши только в роли оптимизации.
А вот глобальное состояние — это антипаттерн.
http://javanese.online/%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D1%8B_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F/%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%BD%D1%8B%D0%B5_%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D1%8B/singleton/
Спасибо тем, кто решает задачи и сообщает об ошибках.
Исправил обе — «Расставить знаки» и «Деление чисел с плавающей точкой».
Готовлю статьи о шаблонах проектирования, но и многопоточку стороной не обойду.
Что наиболее актуально для обучающего курса?
anonymous poll
Хардкорная многопоточка — lock-free и wait-free алгоритмы – 25
👍👍👍👍👍👍👍 43%
Шаблоны и антишаблоны проектирования. Чем хороши, плохи или ужасны те или иные ШП в зависимости от контекста – 22
👍👍👍👍👍👍 38%
Дописать главу про стдлибу — Tree/Enum/Weak Map/Set, java.time, BigInteger/BigDecimal, NumberFormat, String.format, ... – 5
👍 9%
ФП на Java: лямбда-выражения и функциональные интерфейсы, стримы и т. д. – 5
👍 9%
Другое (в личку @Harmonizr) – 1
▫️ 2%
👥 58 people voted so far.
Пора перестать ставить
@Expose на все поля DTO.
А для тех, кто рекомендует делать clear+addAll вместо простой замены одной коллекции на другую, есть отдельный котёл.
Ревью для Алексея.
http://javanese.online/%D1%80%D0%B0%D0%B7%D0%B1%D0%BE%D1%80_%D0%BA%D0%BE%D0%B4%D0%B0/expose_clear_addall/#android
1. Когда вертикальный
LinearLayout внутри ScrollView измеряет своих детей, в качестве heightSpec они получают количество оставшихся свободных пикселей, режим UNSPECIFIED. Для тех детей, до которых нужно скроллить, количество оставшихся пикселей — 0.
2. Когда RecyclerView находится в режиме autoSizing, а высота пришла ненулевая, он принимает эту высоту, невзирая на Mode.
И вот, эти два фактора столкнулись: autoSizing работал некорректно, не отображалось несколько последних строк.
Лечится наследованием RecyclerView и переопределением onMeasure. (Нужно передать нулевую высоту, если она UNSPECIFIED.)Спасибо внимательным читателям за жалобы на то, что решения некоторых задач не принимаются.
Вот поэтому под Android так больно разрабатывать.
И по той же причине я не рекомендую Android в качестве первой платформы.
http://javanese.online/%D1%81%D1%82%D0%B0%D1%82%D1%8C%D0%B8/%D1%84%D1%83%D0%BD%D0%B4%D0%B0%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5_%D0%BF%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D1%8B_android/
