Чому в Котліні немає статичного ключового слова?


29

Kotlin відомий перш за все як замінна Java для заміни, але позбавляється від добре відомої конструкції Java: staticключового слова. Натомість цю функціональність на рівні класу пропонують переважно супутні об’єкти.

Що не так у статичних методах та полях, які супутні об’єкти дають кращу альтернативу? Я розгублений в обґрунтуванні, і не зміг знайти жодного пояснення в документації.


4
Просто видно, як хтось, хто програмує в масштабі: об'єкти-супутники відокремлюють код для статичних та нестатичних методів, вони можуть розширювати інші класи чи інтерфейси у статичному контексті, а ви можете посилатись на супутній об’єкт у змінній. не впевнений, як це карта до Котліна, хоча
Фенікс

Чи є статичні методи і що не мають суттєвої переваги перед супутніми об'єктами?
Tanner Swett

Це не причина, більше спостереження, але я помітив, що як тільки (абсолютні) програмісти-початківці відкриють staticключове слово на Java, воно негайно поширюється на всі кути програми, оскільки їх ще не навчили об’єктно-орієнтованому програмуванню .
Score_Under

Відповіді:


30

Scala також замінює декларації рівня класу об'єктом "Singleton". Основна перевага цього в тому, що все є предметом. У Java до статичних членів трактується дуже інакше, ніж до об’єктів. Це означає, що ви не можете робити такі речі, як реалізація інтерфейсу або розміщення «екземпляра» свого класу на карті або передавати його як параметр методу, який приймає Object. Об'єкти-супутники допускають ці речі. Оце перевага.


2
Це хороший момент. І я завжди думав, що це дивно, що є одинаки та статики, які мають дуже схожу поведінку, але, окрім супутніх предметів, це усуває цю концептуальну дивацтво.
користувач1446

1
І саме тому в Java я вважаю за краще визначати методи на статично побудованих об'єктах без стану, ніж визначати статичні.
candied_orange

13

Посилаючись на довідкові документи Котліна :

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

Мені це дуже звучить, як дизайнери Kotlin вважають це перевагою перед статичними членами Java.

Більше того, частина про сумісність Java та статичні члени пояснює, як супутні об'єкти можуть бути використані для створення членів, які ведуть себе ефективно, як статичні члени при анотації до @JvmStatic.


6

Котлін - об'єктно-орієнтована мова. У об'єктно-орієнтованій мові те, що не є об'єктом, є надзвичайно каліцтвом обмеження. Класи - це не об’єкти, а об’єкти - це об'єкти (так!), Тому питання, швидше, має бути таким: чому мова не використовує супутні об’єкти?

Ще один аспект - це простота: навіщо мати дві речі, об'єкти з членами екземпляра та класи зі статичними членами, коли ви можете просто мати об'єкти з членами екземпляра?

Альтернативою, яка використовується у багатьох мовах похідних Smalltalk, є створення самих класів об'єктами. Наприклад, у класах Smalltalk - це випадки паралельної ієрархії метакласів . У Ruby класи - це екземпляри Classкласу (і так, це означає, що Classце сам екземпляр). У цьому випадку "методи класу" - це фактично звичайні методи екземпляра метакласу класу. Я не знаю, чому цей дизайн не був обраний в Java (з огляду на його близьке відношення до Smalltalk), але це може мати щось спільне зі спрощенням системи типів (зауважте, що більшість мов із класами-об'єктами, як правило, є динамічні мови).


1
"Ще один аспект - простота: чому є дві речі, об'єкти з членами екземпляра та класи зі статичними членами, коли ви можете просто мати об'єкти з членами екземпляра?": Добре, хоча не всі дизайнери мови / мови спрямовані на мінімалізм. Деякі вважають це перевагою створення спеціальних конструкцій для особливих випадків або ідіом.
Джорджіо

1
Я думаю , що це по крайней мере , можна стверджувати , що Java робить (кілька) реалізувати цю схему. Наприклад, якщо у вас є MyStaticClassдеякі staticчлени, ви можете посилатися, MyStaticClass.classщоб отримати Classекземпляр для цього класу. Потім ви можете використовувати роздуми для доступу / виклику своїх staticчленів. Досі вірно, що staticчлени насправді не прикріплені до жодного об'єкта (хоча б концептуально; не впевнені, що Java насправді робить під обкладинками). Але це означає, що принаймні деякі межі, підняті у прийнятій відповіді, строго не застосовуються.
aroth
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.