Привет всем!
Не один раз нам приходилось писать что-то наподобии:
Код выше -- не Скале, но код на Java немногим отличается (да еще и более многословен).
Все вроде нормально, но он содержит так называемый boiler plate code.
Т.е. к смысловому значению "подмешивается" "обвязка", код, который нужен языку, а не программисту.
Смысл тут в строке println(...) и в том что мы "вешаем" обработчик на кнопку. Создание анонимного внутреннего класса (который имплементирует интерфейс ActionListener) и описание метода actionPerformed(...) это то, что приходится писать, а не то что хочется.
Использую возможность Скалы неявного преобразования типов можно свести вышеописанное к простому виду:
Напишите функцию в scope кода выше:
Эту функцию также можно подключать во всех классах где она может быть нужной (что и делается в очень многих местах стандартной библиотеки классов Scala).
Техника неявного преобразования широко используется в языке Скала и является одной из возможностей, которой нет в Java.
Главное -- это использовать ее в меру, поскольку подключения массы таких функций из разных мест может серьезно осложнить чтение кода.
Не один раз нам приходилось писать что-то наподобии:
- val button = new JButton
- button.addActionListener(new ActionListener {
- def actionPerformed(e: ActionEvent) {
- println("A lot of boiler-plate code.")
- }
- })
Код выше -- не Скале, но код на Java немногим отличается (да еще и более многословен).
Все вроде нормально, но он содержит так называемый boiler plate code.
Т.е. к смысловому значению "подмешивается" "обвязка", код, который нужен языку, а не программисту.
Смысл тут в строке println(...) и в том что мы "вешаем" обработчик на кнопку. Создание анонимного внутреннего класса (который имплементирует интерфейс ActionListener) и описание метода actionPerformed(...) это то, что приходится писать, а не то что хочется.
Использую возможность Скалы неявного преобразования типов можно свести вышеописанное к простому виду:
- button.addActionListener((e: ActionEvent) => {
- println("Much better")
- })
Напишите функцию в scope кода выше:
- /**
- * Implicit conversion function:
- * from function: (ActionEvent => Any)
- *
- * Note: You can choose any name you want for this function
- */
- implicit def ActionListenerToFunction(fn: (ActionEvent => Any)) = new ActionListener {
- def actionPerformed(e: ActionEvent) {
- fn(e)
- }
- }
Эту функцию также можно подключать во всех классах где она может быть нужной (что и делается в очень многих местах стандартной библиотеки классов Scala).
Как все это работает:
Если в коде встречается функция, которая принимает ActionEvent, а возвращает тип Any, то происходит замена такого кода кодом:
new ActionListener { def actionPerformed(e: ActionEvent) { fn(e) } }т.е.неявная функция-преобразователь сделает за нас работу по имплементированию интерфейса и вызовет fn() с параметром "е". А сама fn(...) это --
(e: ActionEvent) => { println("Much better") })
Техника неявного преобразования широко используется в языке Скала и является одной из возможностей, которой нет в Java.
Главное -- это использовать ее в меру, поскольку подключения массы таких функций из разных мест может серьезно осложнить чтение кода.
Комментариев нет:
Отправить комментарий