Как стать автором
Обновить

Комментарии 26

Data — классы есть как минимум в скале, которая появилась раньше котлина. Причём в case классах скалы поля могут быть изменяемыми.

Да, Вы правы. Так и есть.
В котлине поля тоже могут быть изменяемыми, а также дата-классы можно наследовать(а вместе с sealed классами и выводом типов это вообще бомба). А ещё copy-методы и component*-методы, а значит — деструктуризация!
А тут… «Ну, нам лень писать код, и кодогенераторы мы тоже не осилили, поэтому вот рекорды».

Деструктуризация рекордов планируется в Java 15 в виде превью-фичи. Уже JEP завели.


Не понял пассаж про лень и не осилили. К чему это? Кому лень? Кто не осилил?

А еще конструктор у case классов может быть каррированным. И второй спосок аргументов не участвует в equals и hashCode. А значит их можно безопасно хранить в контейнерах.


image

И вот, в 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. Всё какое-то ниочём.
Отступы сохраняются относительно первого символа, IDEA подсвечивает их специальной вертикальной линией.

Но что, если я хочу отступ?..

Закройте кавычку левее. Положением закрывающей кавычки можно регулировать положение отступа.

Отступы будут автоматически убираться. Почитайте JEP по этой фиче — он довольно короткий и простой. Мне уже попадались случаи где функциональность из него была бы удобнее того, что сейчас сырые строки в котлине предоставляют.

Вы жалуетесь что чего-то нету, когда оно на самом деле есть? Оригинально.


И если вам кажется, что фичи несвязанные и висящие в воздухе, попробуйте подумать с другой стороны. А может вам это только кажется? Может, вы чего-то не знаете? Может, всё-таки это делали люди не глупее вас?

Я не жалуюсь, я высказываюсь. Все последние релизы джавы как языка, с моей точки зрения, какие-то убогие и непродуманные. Просто надергивают фичей из других языков.

Вы совершенно неправы. Все фичи продуманные. Над некоторыми думали годами и продолжают думать. И то что завезли — switch, instanceof, record — это маленькие куски более общей картины, которая соберётся позднее. Критика на уровне "фу, бяка" без конструктива не делает чести никому.

Ну, дай бог.

JEP 361. Switch-лямбды

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

В своё время в Java 9 появился JShell, очень похожий на питоний Jupiter.

Похож примерно никак. Это калька с реплов, а не семейства ноутбуков.

Изложение слабовато, конечно. "Присвоение ссылки объекту" — что это вообще за жесть? Как объекту можно присвоить ссылку?

Угу. В итоге оказалось лучше искать по списку интересующие jep и читать доку.
Как объекту можно присвоить ссылку? Давайте подумаем.
Как нам известно, объект создаётся при помощи конструкции

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мб.

А у меня были какие-то проблемы с pack200 при создании инсталлятора через IzPack.
Сейчас уже не помню какие именно, но решались они именно отключением pack200.
Я к тому что с ним можно внезапно поймать проблемы на пустом месте.

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 может быть только поле, а не метод :)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории