Комментарии 26
Data — классы есть как минимум в скале, которая появилась раньше котлина. Причём в case классах скалы поля могут быть изменяемыми.
А тут… «Ну, нам лень писать код, и кодогенераторы мы тоже не осилили, поэтому вот рекорды».
А еще конструктор у case классов может быть каррированным. И второй спосок аргументов не участвует в equals и hashCode. А значит их можно безопасно хранить в контейнерах.
И вот, в Java 14 проблема решена. Теперь, используя тройные кавычки, можно писать любой текст:
String html = """ <html> <body> <p>Hi all!</p> </body> </html> """;
И что будет с отступами? Оно их уберет само или нет? Если да, то сколько и как не убирать? Или придется маяться вот такой ерундой?
class Foo {
void foo() {
final String html = """
<html>
<body>
<p>Hi all!</p>
</body>
</html>
""";
bar(html);
}
}
Экстеншн-методов в джаву не завезли, так что trimIndent()/trimMargin() как в котлине сделать не получится. Добавлять такие методы в строку? Тупо. Делать статические методы и заворачивать в них? Уродливо.
Что сказать-то хотел. Фичей завозят, типа «мы модные», но фичи все какие-то несвязные и висящие в воздухе, типа «ну это удобно».
То же самое про instanceof. То же самое про records. Всё какое-то ниочём.

Отступы будут автоматически убираться. Почитайте JEP по этой фиче — он довольно короткий и простой. Мне уже попадались случаи где функциональность из него была бы удобнее того, что сейчас сырые строки в котлине предоставляют.
Вы жалуетесь что чего-то нету, когда оно на самом деле есть? Оригинально.
И если вам кажется, что фичи несвязанные и висящие в воздухе, попробуйте подумать с другой стороны. А может вам это только кажется? Может, вы чего-то не знаете? Может, всё-таки это делали люди не глупее вас?
Я не жалуюсь, я высказываюсь. Все последние релизы джавы как языка, с моей точки зрения, какие-то убогие и непродуманные. Просто надергивают фичей из других языков.
JEP 361. Switch-лямбды
Это не лямбды. С чего такая вольность в переложении?!
В своё время в Java 9 появился JShell, очень похожий на питоний Jupiter.
Похож примерно никак. Это калька с реплов, а не семейства ноутбуков.
Изложение слабовато, конечно. "Присвоение ссылки объекту" — что это вообще за жесть? Как объекту можно присвоить ссылку?
Как нам известно, объект создаётся при помощи конструкции
var user = new User();
Как работает эта конструкция (если вкратце)?
new — ключевое слово, выделяющее память под объект.
User — тип объекта.
() — вызываемый конструктор.
и самое главное — user — это ссылка.
Соответственно, при создании нового объекта происходит выделение памяти под этот объект, в нужный конструктор отправляются параметры, если они есть, и объекту присваивается ссылка, по которой мы можем этот объект потом достать.
Можем ли мы присвоить объекту ещё одну ссылку? Конечно. Например:
user1 = user;
Что произошло? Мы не создали новый объект, не выделили память под него. Мы просто присвоили ему ещё одну ссылку. Теперь объект доступен из памяти по двум ссылкам, а не по одной.
Окей. Как происходит преобразование объекта?
Object object = getObject();
var user = (User) object;
При преобразовании объекта, насколько мне известно, происходит следующее:
— тип объекта теперь User, со всеми полями и методами
— новый объект при этом не создаётся
— преобразованному объекту присваивается новая ссылка — user.
Теперь объект можно получить по обеим ссылкам — по старой и по присвоенной.
Так почему присвоение ссылки объекту? Потому что для одного объекта может быть много ссылок, а для ссылки объект всего один. Ссылка принадлежит объекту, а не наоборот.
Но Вы и так это знаете.
Теперь объект доступен из памяти по двум ссылкам, а не по одной.
Теперь в переменную user1
записана ссылка на инстанс объекта.
Есть "две переменных которые ссылаются на один объект", но как по мне это не тоже самое что "две ссылки на один объект".
Я под "ссылкой на объект" понимаю ссылку на адрес в памяти, и у одного объекта есть только один адрес в памяти.
С точки зрения GC у такого объекта будет две переменных через которые он доступен, но и это не тоже самое что "две ссылки".
Так почему присвоение ссылки объекту?
Потому что для одного объекта может быть много ссылок, а для ссылки объект всего один.
Ссылка принадлежит объекту, а не наоборот.
Есть инстанс объекта с одним адресом в памяти. Для меня это и есть ссылка. И эта ссылка строго одна.
На один объект могут ссылаться много переменных, но это никак не влияет на сам объект (кроме точки зрения GC).
преобразованному объекту присваивается новая ссылка — user
Объекту в данном случае вообще пофиг — его никто и никак не изменяет и уж точно объекту никто ничего не присваивает.
И раз уж мне действительно непонятно, что это товарищ прицепился с таким замечанием, так может, Вы позволите ему самому высказаться и объяснить свою позицию?
А Вам — хороших выходных.
Объекту в данном случае вообще пофиг — его никто и никак не изменяет и уж точно объекту никто ничего не присваивает.
В принципе valery1707 всё правильно сказал, незачем повторяться. "Присвоить объекту что-то" означает что объект будет этим владеть, обладать, либо это станет свойством объекта. Можно присвоить значение переменной, здесь всё нормально: переменную как раз можно представлять как контейнер со значением, и значение является её свойством.
но зачем заниматься буквоедством?
Ну извините, у слов в языке есть смысл. Если вы используете слова произвольно, не так как принято в языке, то будьте готовы к претензиям. Я всё-таки считаю, что пост на Хабре должен быть поприличнее качеством чем рандомное высказывание в чате (пусть злые языки говорят, что Хабр не торт). Если у вас другое мнение, то в принципе ладно, мы можем остаться при своём и не вдаваться в дальнейшую дискуссию.
большинство постов на Хабре пишутся для широкой публики, максимально просто и понятно.
Использование слов не в общепринятом значении не способствует простоте и понятности.
Ну теперь-то уж нам только и остаётся, что «остаться при своём», благо, Ваш адвокат постом выше очень обстоятельно лёг на абмразуру, так что, вдаваться в дальнейшую дискуссию, действительно, смысла нет.
За pack200 обидно. jar это и так архив, он плохо жмется чем-то сверху.
Без pack200 размер установщика у нашего приложения с интегрированной jre около 130мб, сжато lzma.
При pack200 + lzma размер 80мб.
JEP 343. Упаковщик jpackage (Инкубатор)
Вроде всё красиво, одно не понятно: как запихнуть в пакет ресурсы приложения с фс,
то бишь произвольные файлы, которые надо положить в конкретное место.
Есть такая штука в Java, как JFR — Java Flight Recording — фиксация событий «на лету», которая позволяет мониторить около 500 разновидностей событий во время работы приложения. Проблема в том, что большинство из них можно посмотреть только в логах.
Я думал jfr может только в бинарь писать...
Exception in thread "main" java.lang.NullPointerException: Cannot assign field "cities" because "countries" is null
at Main.main(Main.java:21)
Мне не понятно, почему сообщение ссылается на поля, а не на методы. А если геттер возвращает вообще другое поле/сам что-то вычисляет или вообще сам возвращает null
?
Вроде всё красиво, одно не понятно: как запихнуть в пакет ресурсы приложения с фс,
то бишь произвольные файлы, которые надо положить в конкретное место.
Вероятно, разработчики планируют использовать упаковщик только для десктопных приложений, где обычно не подразумевается распределение пропертей.
Мне не понятно, почему сообщение ссылается на поля, а не на методы. А если геттер возвращает вообще другое поле/сам что-то вычисляет или вообще сам возвращает null?
Ну так null может быть только поле, а не метод :)
Java 14: Record, более лаконичный instanceof, упаковщик jpackage, switch-лямбды и текстовые блоки