Kotlin'de neden statik anahtar kelime yok?


29

staticAnahtar kelimeler : Kotlin, öncelikle Java'nın yerine geçmesi olarak bilinir, ancak iyi bilinen bir Java yapısından kurtulur: anahtar kelime. Bunun yerine, bu sınıf düzeyinde işlevsellik esas olarak eşlik eden nesneler tarafından sunulur.

Eşlik eden nesnelerin daha iyi bir alternatif sağladığı statik yöntem ve alanların nesi yanlış? Gerekçe hakkında kafam karıştı ve belgelerde herhangi bir açıklama bulamadım.


4
Sadece scala'da programlar yapan biri olarak şunu söyleyerek: eşlik eden nesneler, statik ve statik olmayan metotlar için kodu ayırır, diğer sınıfları veya arayüzleri statik bir bağlamda genişletebilirler ve eşlik eden nesneye değişken olarak başvuru yapabilirsiniz. emin değilim o nasıl kotlin için haritalar
Phoenix, 18

Statik yöntemler var ve eşlik eden nesneler üzerinde önemli bir avantajı yok mu?
Tanner Swett

Sebep bu değil, daha fazla gözlem, ama (mutlak) yeni başlayan programcıların staticanahtar kelimeyi Java'da keşfettiği anda, programın tüm köşelerine yayıldığını gördüm, çünkü henüz nesneye yönelik programlama öğretmediler. .
Score_Under

Yanıtlar:


30

Scala ayrıca sınıf seviyesindeki bildirimleri bir 'Singleton' nesnesiyle değiştirir. Bunun en büyük avantajı, her şeyin bir nesne olmasıdır. Java'da statik üyelere nesne üyelerinden çok farklı davranılır. Bu, bir arayüz uygulamak veya sınıfınızın 'örneğini' bir haritaya koymak ya da Object'i alan bir yönteme parametre olarak iletmek gibi şeyleri yapamayacağınız anlamına gelir. Eşlik eden nesneler bu şeylere izin verir. Avantaj bu.


2
İyi bir noktaya değindin. Ve hep çok benzer davranışlara sahip olan tektonların ve statiklerin olmasının garip olduğunu düşündüm, ama eşlik eden nesneler dışında hiçbir şey olmadan, bu kavramsal tuhaflığı ortadan kaldırıyordu.
kullanici1446

1
İşte bu yüzden Java'da statik yöntemleri tanımlamak yerine statik yapılı durumsuz nesneler üzerinde yöntemleri tanımlamayı tercih ediyorum.
candied_orange

13

Kotlin referans dokümanlarından alıntı :

Eşlik eden nesnelerin üyeleri diğer dillerdeki statik üyelere benzese de, çalışma zamanında hala gerçek nesnelerin örnek üyeler olduklarını ve örneğin arayüzleri uygulayabileceklerini unutmayın.

Bana öyle geliyor ki Kotlin tasarımcıları bunu Java'nın statik üyelerine göre bir avantaj olarak görüyorlar.

Ayrıca, Java ile birlikte çalışabilirlik ve statik üyeler hakkındaki bölüm, eşlik eden nesnelerin, açıklama eklendiğinde statik üyeler gibi etkili davranan üyeler oluşturmak için nasıl kullanılabileceğini açıklar @JvmStatic.


6

Kotlin nesne yönelimli bir dildir. Nesne yönelimli bir dilde, nesne olmayan bir şey son derece sakatlayıcı bir kısıtlamadır. Sınıflar değildir nesneler, ancak nesneler soru ziyade olmalı, böylece nesnelerdir (yaa!): Neden bir dil olurdu değil refakatçi nesneleri kullanabilirsiniz?

Diğer bir yön basitliktir: neden iki örneği vardır, örnek üyeli nesneler ve sadece örnek üyeli nesneler varken statik üyeli sınıflar?

Birçok Smalltalk türevi dilde kullanılan bir alternatif, sınıfları kendileri nesne yapmaktır. Örneğin, Smalltalk sınıflarında paralel bir metaclass hiyerarşisi örneğidir . Ruby'de sınıflar sınıfın örnekleridir Class(ve evet, bunun Classbir örneği olduğu anlamına gelir ). Bu durumda, "sınıf yöntemleri" aslında sınıfın metaclass'ının normal örnek yöntemleridir. Bu tasarımın neden Java'da seçilmediğini bilmiyorum (Smalltalk ile olan ilişkisine yakın olduğu için), ancak tür sistemini basitleştirmeyle ilgili olabilir (nesne sınıfı gibi birçok dilin olma eğiliminde olduğunu unutmayın). dinamik diller).


1
“Başka bir yön basitlik: neden iki şey var, örnek üyeli nesneler ve sadece örnek üyeli nesneler varken statik üyeli sınıflar mı?”: İyi bir nokta, tüm diller / dil tasarımcıları minimalizmi hedeflemese de. Bazıları özel durumlar veya deyimler için geçici yapılara sahip olmanın bir avantaj olduğunu düşünüyor.
Giorgio

1
Ben Java en azından tartışılabilir olduğunu düşünüyorum yok (biraz) o deseni uygulamak. Örneğin, varsaMyStaticClass bazı staticüyeleriniz varsa, o sınıfa örnek MyStaticClass.classalmak için başvuruda bulunabilirsiniz Class. Daha sonra staticüyelerinize erişmek / çağırmak için yansıma kullanabilirsiniz . staticÜyelerin aslında herhangi bir nesne örneğine bağlı olmadığı doğrudur (en azından kavramsal olarak; Java'nın kapakların altında ne yaptığından emin değilsiniz). Ancak bu, kabul edilen cevapta belirtilen sınırların en azından bir kısmının kesinlikle geçerli olmadığı anlamına gelir .
17'de
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.