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

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

Интересно. Я уже предлагал похожий способ решения этой проблемы. Ваш способ синтаксически более лаконичен.
Да, использование замыкания здесь напраашивается, оно позволяет:
  1. Отказаться от ThreadLocal (а это, на минуточку, глобальное состояние)
  2. Сократить API, выкинув метод root()

Но, к сожалению, громоздкий синтаксис (prior to Java 8) губит всю идею.

Лямбды восьмой Джавы здесь могут помочь (укоротить синтаксис, в реализации они ничего не меняют), но не сильно.

Сравните:

Account account = root(Account.class);
tableBuilder.addColumn( $( account.getCustomer().getName() ) );

и

tableBuilder.addColumn( $(Account.class, (account) -> account.getCustomer().getName() ) );

Все равно громоздко. К тому же, у нас была задача использовать это в уже существующих проектах (не Java 8).

Правда у лямбд здесь есть неоспоримое преимущество, они позволяют захватить типизацию «рута»:

public static <R, T> BeanPath<R, T> $(Class<R> root, CallChain<R, T> callChain) (...)

А это уже повод задуматься о том чтобы реализовать такой синтаксис в следующей версии.
НЛО прилетело и опубликовало эту надпись здесь
Скорее, позволяют решить проблему более изящно.
Не решают.

Здесь, видимо, имеется ввиду возможность C# (я — нуб в C# :-) получать из лямбды Expression trees, а ходить по ним в рантайме. Но лямбды Java так не работают, если не углубятся в тонкости, это скорее лаконичный синтаксис создания анонимных классов (и да простят меня за эти слова создатели лямбд Java).

А на счет изящности — это спорный вопрос (смотри коммент выше).
По мне, отказаться от глобального состояния и укоротить синтаксис — это и значит, сделать более изящно.
Интересно решение, спасибо за статью. Где же вы были раньше, пока не было java8)
НЛО прилетело и опубликовало эту надпись здесь
Но это же поддерживать надо и тяжело, да и код лишний. Автогенерация, как мне кажется, решает проблему изящнее.
НЛО прилетело и опубликовало эту надпись здесь
Вообще-то я не автор. Но в принципе ровно так же можно генерировать в компайл-тайме константа, которые генерируете вы.
Либо я чего-то сильно не понимаю, либо Java 8 принципиально здесь ничего не меняет. Другой синтаксис но от динамических прокси, чтобы вытащить имена свойств, никуда не уйти.
Мы тоже в свое время использовали доллар в качестве имени метода для своих целей. Но кажется, что это не совсем правильная практика, т.к. Java использует тот же символ для работы с внутренними классами и другими сущностями. stackoverflow.com/questions/7484210/what-is-the-meaning-of-in-a-variable-name Не наблюдали ли вы с этим проблем?
С проблемами не сталкивался.

Действительно, хотя доллар вполне законный символ в идентификаторе, по соглашению, он зарезервирован для сгенерированого кода (в частности, самим javac), поэтому стоит избегать его использования в «ваших» именах. Чтобы не поймать конфликт имен. Но это не строгий запрет.

Некоторые кодогенераторные фрэймворки используют $ для своих «искусственных» переменных/методов. Например, так делает Lombok.

Не используйте $, если у вас нет веской на то причины.

Здесь причина: 1) максимально сократить код и 2) ввести как будто бы новую синтаксическую конструкцию.
Напишите пожалуйста в ридми на гитхабе эти примерчики, чтобы дока была рядом с кодом — ну и там же можно и эту статейку линкануть для двусторонней связи
Ага, написал. Спасибо что не поленились сделать pull request.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий