Які переваги об'єктів-компаньйонів Scala перед статичними методами?


50

Scala не має статичного ключового слова, але натомість має подібну функціональність через супутні об’єкти. За лаштунками супутні об’єкти складаються в класи, які мають статичні методи, тому все це синтаксичний цукор. Які переваги цього вибору дизайну? Недоліки? Чи мають інші мови подібні конструкції?


Відповіді:


49

Ось кілька причин, які можуть бути для вас більш-менш переконливими, залежно від ваших власних уподобань:

  1. Не просто знижуйте його за те, що він "синтаксичний цукор". Хоча ви можете сказати, що щось є просто синтаксичним цукром, адже саме цукор підсолоджує ваше життя - як програміст так само, як і кавоварка або чайник.

  2. Синглтони - кожна Скала objectза своєю суттю є одинаком. Враховуючи те, що в світі Java люди реалізують одиночні букви всілякими різними способами і частіше за все роблять помилку в їх здійсненні, ви не можете зробити помилку настільки простою, як у Scala. Писання objectзамість цього classробить його однотонним, і ви закінчили.

  3. Доступ до статичних методів: Статичні методи на Java можуть бути доступні з об'єктів. Наприклад, припустимо, у вас є клас Cзі статичним методом fта об'єктом cтипу C. Тоді вам слід зателефонувати C.f, але Java дозволяє (хоча з попередженням) використовувати c.f, що, коли ви переходите з фонового зображення Scala, насправді не має сенсу, тому що об'єкти не мають методу fнасправді.

  4. Чітке розділення: у Java ви можете змішувати статичні та нестатичні атрибути та методи у класі. Якщо ви працюєте дисципліновано, це не стане проблемою, однак, якщо ви (чи хтось інший з цього питання) цього не зробите, ви закінчите статичні та нестатичні частини переплетені, і це важко швидко сказати що статично, а що ні. У Scala все, що знаходиться всередині супутнього об’єкта, зрозуміло, не є частиною об'єктів виконання відповідного класу, але доступне зі статичного контексту. І навпаки, якщо він записаний всередині класу, він доступний для примірників цього класу, але не зі статичного контексту. Це стає особливо обтяжливим для Java, коли ви починаєте додавати статичні та нестатичні блоки ініціалізаторів у свій клас. Це може бути дуже важко зрозуміти з точки зору динамічного порядку виконання.

  5. Менший код: Вам не потрібно додавати слово статичний до кожного атрибута чи методу в object, таким чином, зберігаючи код більш стислим (справді, це не є помітною перевагою).

Недоліки знайти набагато складніше. Можна стверджувати, що статична та нестатична частини повинні належати разом, але розділені концепцією Scala супутніх об'єктів. Наприклад, дивним є діаграма класів, але потім у коді потрібно створити дві речі та розсікати, який атрибут куди йде.


1
Я також читав, що статики не належать до чистого програмного забезпечення OOP. Наприклад, коли вам потрібна статична поведінка, використовуйте власний клас і створіть один (однотонний) об'єкт з нього, який керує (потенційно) статичною поведінкою об'єктів іншого класу.
К ..

1
"Запис об'єкта замість класу робить його однотонним, і ви закінчили." Я не сильно дбаю про Сінглтонса, але мушу визнати, що безпосередність саме цього «синтаксичного цукру» має певний шарм.
Ед Гастінгс

3
Жоден з пунктів від 1 до 5 (і навіть усі вони разом) не потребує справжнього супутнього об'єкта під час виконання. Усі вони можуть бути легко виготовлені з чистого синтаксичного цукру з нульовим впливом часу виконання. Єдина реальна причина мати об’єкт супутникового виконання - у відповіді Олексія Романова.
mas.morozov

"Недоліки набагато складніше знайти". Продуктивність? доступ до об'єктного методу генерує ifnonnullі т.д. байт-код, порівняно з просто invokeStatic.
Едуардо Пареджа Тобес

33

Ще одна перевага полягає в тому, що objects може реалізовувати інтерфейси / риси, на відміну від статичних методів.


8
Я думаю , що це головна відмінність між об'єктом компаньйона проти класу зі статичними методами. Об'єкт-супутник поліморфний і його можна передавати як аргумент методам, які очікують інтерфейсу / ознаки.
dcastro

4

Об'єкти-супутники - це перше місце, де шукаються імпліцити, після чого scala дивиться на Preef, а потім у явні "імпортні" заяви у цьому конкретному вихідному файлі.

Мені не вистачає Java-розробника, щоб знати, чи є мова Java або бібліотеки якийсь подібний механізм.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.