Kotlinに静的キーワードがないのはなぜですか?


29

Kotlinは主にJavaのドロップイン置換として知られていますが、よく知られているJava構成要素であるstaticキーワードを取り除きます。代わりに、そのクラスレベルの機能は、主にコンパニオンオブジェクトによって提供されます。

コンパニオンオブジェクトがより良い代替を提供する静的メソッドとフィールドの何が問題になっていますか?私は理論的根拠について混乱しており、ドキュメンテーションで説明を見つけることができませんでした。


4
scalaでプログラミングする人として見れば、コンパニオンオブジェクトは静的メソッドと非静的メソッドのコードを分離し、静的コンテキストで他のクラスまたはインターフェースを拡張でき、変数でコンパニオンオブジェクトを参照できます。それがコトリンにどのようにマッピングされるかわからない
フェニックス

静的メソッドやその他のオブジェクトには、コンパニオンオブジェクトよりも大きな利点がありますか?
タナースウェット

これは理由ではなく、より多くの観察ですが、(絶対的な)初心者プログラマーstaticがJavaでキーワードを発見するとすぐに、オブジェクト指向プログラミングがまだ教えられていないため、すぐにプログラムの隅々に伝播することがわかりました。
Score_Under

回答:


30

また、Scalaはクラスレベルの宣言を「シングルトン」オブジェクトに置き換えます。これの主な利点は、すべてがオブジェクトであることです。Javaでは、静的メンバーはオブジェクトメンバーとは非常に異なる方法で処理されます。つまり、インターフェイスを実装したり、クラスの「インスタンス」をマップに配置したり、Objectを受け取るメソッドにパラメーターとして渡したりすることはできません。コンパニオンオブジェクトはこれらのことを可能にします。それが利点です。


2
それは良い点です。そして、非常によく似た振る舞いをするシングルトンとスタティックが存在するのは奇妙だといつも思っていましたが、コンパニオンオブジェクト以外では、その概念的な奇妙さはなくなります。
user1446

1
これがまさに、Javaで静的メソッドを定義するよりも、静的に構築されたステートレスオブジェクトにメソッドを定義することを好む理由です。
candied_orange

13

Kotlin リファレンスドキュメントから引用:

コンパニオンオブジェクトのメンバーは、他の言語では静的メンバーのように見えますが、実行時にはまだ実際のオブジェクトのインスタンスメンバーであり、たとえばインターフェイスを実装できます。

Kotlinの設計者がこれをJavaの静的メンバーに対する利点と見なしているように思えます。

さらに、Javaの相互運用性と静的メンバーに関する部分では、コンパニオンオブジェクトを使用して、で注釈を付けたときに静的メンバーのように効果的に動作するメンバーを作成する方法について説明し@JvmStaticます。


6

Kotlinはオブジェクト指向言語です。オブジェクト指向言語では、オブジェクトではないもの非常に不自由な制限です。クラスはオブジェクトではありませんが、オブジェクトはオブジェクトです(だから!)ので、質問は、言語コンパニオンオブジェクトを使用しないのはなぜでしょうか?

もう1つの側面は単純さです。インスタンスメンバを持つオブジェクトと、インスタンスメンバを持つオブジェクトだけを持つことができるのに、静的メンバを持つクラスという2つのものがあるのはなぜですか。

多くのSmalltalk派生言語で使用されている代替手段は、クラス自体をオブジェクトにすることです。たとえば、Smalltalkクラスのメタクラスの並列階層のインスタンスです。Rubyでは、クラスはクラスのインスタンスですClass(はい、それはそれClassがそれ自体のインスタンスであることを意味します)。その場合、「クラスメソッド」は実際にはクラスのメタクラスの単なる通常のインスタンスメソッドです。Javaでこの設計が選択されなかった理由はわかりません(Smalltalkとの関係が近いため)動的言語)。


1
「もう1つの側面は単純さです。インスタンスメンバーを持つオブジェクトと、静的メンバーを持つクラスの2つの理由があるのはなぜですか?」特別なケースやイディオムのためにアドホックな構造を持つことを利点と考える人もいます。
ジョルジオ

1
Java そのパターンを(ある程度)実装すること、少なくとも議論の余地があると思います。たとえば、MyStaticClassいくつかのstaticメンバーMyStaticClass.classがいるClass場合、そのクラスのインスタンスを取得するために参照できます。その後、リフレクションを使用してstaticメンバーにアクセス/呼び出しできます。staticメンバーが実際にオブジェクトインスタンスにアタッチされていないことは事実です(少なくとも概念的には、Javaが実際に何をしているかわからない)。しかし、受け入れられた回答で提起された制限の少なくとも一部が厳密に適用されないことを意味します。
アロス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.