2016-07-30 6 views
1

インスタンス状態に依存しないクラスのメソッドがstaticとマークされることがあります。私は、「このメソッドはインスタンスの状態に依存しない」ということを宣伝するという点ではかなり明確になっています。矛盾した状態の可能性を検討する際に、そのメソッドを完全にスキップするのは簡単です。インスタンス状態を読み書きしないマーキングメソッド

しかし、静的メソッドをマーキングする際の問題は、静的メソッドを継承または上書きできないことです。このような

何かがここで議論されていますDoes it make sense to have a non static method which does not use an instance variable?

は、それは非静的メソッドは、状態に依存しないことを宣言するための注釈を持っている意味をなすだろうか?コンパイラは、それが他の状態に依存しないメソッドのみを使用していることを検証できます。

パイプラインにこのような機能はありますか?

+1

確かにそうです。そのため、C++には* const *があります。たぶんあなたは誰かがJavaコミュニティプロセスの要求に入れているかどうかを確認したいと思うかもしれません。そうでなければ;それを始める;-) ...しかし、真剣に - 静的*の他のビューは:OO内の異常です。あなたが言及した問題に加えて、スタティックコールはまた、より緊密な結合につながります。テストするのが難しいコードです。つまり、可能な限り避けてください。 – GhostCat

+1

@GhostCatこれはC++ constとは異なりますが、これは基本的にはオーバーライド可能/仮想静的メソッドを提案しています。 – hyde

+0

@hydeはい...メソッドに2つのパラメータを渡して1つの戻り値を取得すると、(1)メソッドがこのクラスの2つの入力のみを使用していて、(2)何らかの形で状態を突然変異させる。 – Teddy

答えて

1

javaにはこのようなメカニズムはありません。たとえstaticであっても、すべてのケースをカバーするわけではありません。静的メソッドは静的コンテキストでも状態を変更できます。

class Example { 
    static int counter = 0; 
    static int add(int a, int b) { 
     counter++; 
     return a + b; 
    } 
} 

しかし、静的解析を使用してこの問題を解決するためにいくつかの研究があります。外見はJPureのプロトタイプがあります。

+0

ありがとうございました。それはほぼ私が探していたものです。なぜ私はコアJava言語の機能ではないのだろうか。私はそれがある時点で言語に組み込まれることを願っています。ところで、これに関するいくつかの提案がありますか:http://stackoverflow.com/questions/23995683/improvement-of-package-private-classes-in-java – Teddy

+0

はい、それは便利な機能になります。 Martin Odersky氏は、スカラーロードマップについてのプレゼンテーションで、将来的には機能シグニチャーの副作用をエンコードするエフェクトシステムを持つことに言及しました。しかし、私はJavaのこのような変更はまったく期待していません。 –

+0

私はとても長い間Scalaを見ていません。私はそれを試してみるべきだと思う。安全であるとマークされているので、あなたのコードのセクションを見る必要がないときには、そのコードを気に入っています。不変のコレクションを使用するのと同じ理由、または最終的なフィールドをマークするのと同じ理由です。ありがとうございました。 – Teddy