Обновить
3
Сергей Кошель@skoshel

Пользователь

1
Подписчики
Отправить сообщение
С проблемами не сталкивался.

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

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

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

Здесь причина: 1) максимально сократить код и 2) ввести как будто бы новую синтаксическую конструкцию.
Ага, написал. Спасибо что не поленились сделать pull request.
Либо я чего-то сильно не понимаю, либо Java 8 принципиально здесь ничего не меняет. Другой синтаксис но от динамических прокси, чтобы вытащить имена свойств, никуда не уйти.
Не решают.

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

А на счет изящности — это спорный вопрос (смотри коммент выше).
Да, использование замыкания здесь напраашивается, оно позволяет:
  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) (...)

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

Информация

В рейтинге
Не участвует
Откуда
Москва, Москва и Московская обл., Россия
Дата рождения
Зарегистрирован
Активность