Комментарии 16
Интересно. Я уже предлагал похожий способ решения этой проблемы. Ваш способ синтаксически более лаконичен.
Да, использование замыкания здесь напраашивается, оно позволяет:
Но, к сожалению, громоздкий синтаксис (prior to Java 8) губит всю идею.
Лямбды восьмой Джавы здесь могут помочь (укоротить синтаксис, в реализации они ничего не меняют), но не сильно.
Сравните:
и
Все равно громоздко. К тому же, у нас была задача использовать это в уже существующих проектах (не Java 8).
Правда у лямбд здесь есть неоспоримое преимущество, они позволяют захватить типизацию «рута»:
А это уже повод задуматься о том чтобы реализовать такой синтаксис в следующей версии.
- Отказаться от ThreadLocal (а это, на минуточку, глобальное состояние)
- Сократить 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).
А на счет изящности — это спорный вопрос (смотри коммент выше).
Здесь, видимо, имеется ввиду возможность C# (я — нуб в C# :-) получать из лямбды Expression trees, а ходить по ним в рантайме. Но лямбды Java так не работают, если не углубятся в тонкости, это скорее лаконичный синтаксис создания анонимных классов (и да простят меня за эти слова создатели лямбд Java).
А на счет изящности — это спорный вопрос (смотри коммент выше).
НЛО прилетело и опубликовало эту надпись здесь
Мы тоже в свое время использовали доллар в качестве имени метода для своих целей. Но кажется, что это не совсем правильная практика, т.к. Java использует тот же символ для работы с внутренними классами и другими сущностями. stackoverflow.com/questions/7484210/what-is-the-meaning-of-in-a-variable-name Не наблюдали ли вы с этим проблем?
С проблемами не сталкивался.
Действительно, хотя доллар вполне законный символ в идентификаторе, по соглашению, он зарезервирован для сгенерированого кода (в частности, самим javac), поэтому стоит избегать его использования в «ваших» именах. Чтобы не поймать конфликт имен. Но это не строгий запрет.
Некоторые кодогенераторные фрэймворки используют $ для своих «искусственных» переменных/методов. Например, так делает Lombok.
Не используйте $, если у вас нет веской на то причины.
Здесь причина: 1) максимально сократить код и 2) ввести как будто бы новую синтаксическую конструкцию.
Действительно, хотя доллар вполне законный символ в идентификаторе, по соглашению, он зарезервирован для сгенерированого кода (в частности, самим javac), поэтому стоит избегать его использования в «ваших» именах. Чтобы не поймать конфликт имен. Но это не строгий запрет.
Некоторые кодогенераторные фрэймворки используют $ для своих «искусственных» переменных/методов. Например, так делает Lombok.
Не используйте $, если у вас нет веской на то причины.
Здесь причина: 1) максимально сократить код и 2) ввести как будто бы новую синтаксическую конструкцию.
Напишите пожалуйста в ридми на гитхабе эти примерчики, чтобы дока была рядом с кодом — ну и там же можно и эту статейку линкануть для двусторонней связи
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Статически проверяемые ссылки на свойства Java-бинов