2011-09-14 7 views
6

現在のところ、このフレームワークはより速い開発を約束するため、私はプレイフレームワークで面白いです。多くの静的機能を使用することによる副作用はありますか?

私はコードを見ると、非常に多くの静的コードがあります。コントローラも静的関数として宣言されています。したがって、静的関数内で呼び出されたコードはすべて静的でなければなりません。

私の質問は正しいですか?多くの静的関数を使用する副作用はありますか?

+0

静的メソッドは、引数として渡される静的でない静的メソッドを呼び出すことも、静的フィールドや静的フィールドに渡す静的メソッドを呼び出すこともできます。インスタンスなしで同じクラスの非静的メソッドを呼び出すことはできません。 –

+0

@Peter:詳細を教えてください。 – indrap

答えて

7

オブジェクト指向言語の静的メソッドに関するいくつかの事柄:すべての静的メソッドを選択すると問題を説明しようとします。

すべての静的関数を使用することは、オブジェクト指向言語では慣用的ではない場合があります。 サブクラス内の静的関数をオーバーライドすることはできません。したがって、オーバーライドによって実行時の多型を実行する能力が失われます。

すべてのメソッドは静的なので、定義する変数はすべて自動的にクラス変数になります。したがって、本質的にインスタンスに関連付けられた状態はありません。

静的メソッドはモックするのが難しいです。あなたのために嘲笑をするには、PowerMockのようなフレームワークが必要かもしれません。だから、テストは難しくなります。

実際にはクラスとインスタンスを持たないため、不変クラスを作成できないため、デザインが少し複雑になります。したがって、スレッドセーフなクラスを設計することは困難になります。

+0

テストのために、Play FrameworkでJUNIT4とSeleniumを使用してください。私は単体テストと回帰テストを作成するのに十分だと思います – indrap

+0

あなたのコメントに基づいて「スレッドセーフなクラスを設計するのは難しくなります」と、エンタープライズアプリケーションでプレーフレームワークを使用するのは良いことではありませんか? – indrap

+0

私に明確にさせてください。不変性のクラスを設計することは、同期を導入することなくスレッドセーフなクラスを設計する方法です。もちろん、オブジェクトの状態の変更が必要な場合は、クラスの新しいインスタンスを作成する必要があります。例については、Stringクラスを参照してください。しかし、あなたのメソッドがすべて静的で、あなたが持っているものがすべてクラス変数であれば、インスタンスがないので、不変クラスは問題になりません。静的メソッドだけを持つクラスはスレッドセーフではないと言っているわけではありません。 – Aneesh

-3

はいあまりにも多くの静的関数または変数を使用するという副作用があります。 不要な静的宣言を避ける必要があります。

静的メンバーは、クラスがJREにロードされると常にメモリ空間を作成するためです。あなたがクラスのオブジェクトを作成しなくても、それはメモリを占有します。

+0

コントローラは静的なクラスを使用するので、内部のコントローラを呼び出すすべての関数またはクラスは静的でなければなりません。この場合、静的な使用が必要です。 – indrap

+3

この回答は間違っています。静的メソッドは、インスタンスメソッドより多くのスペースまたは少ないスペースを使用します。そして、クラスのインスタンスが作られているかどうかは違いありません。 –

+0

OPはstatic _fields_ではなく、static _functions_について質問しています。静的フィールドは、クラスがロードされるとすぐにスペースを割り当てますが、インスタンスフィールドはインスタンスが作成されるまで割り当てられません(ただし、静的フィールドに割り当てられたメモリは一度だけ割り当てられますが、インスタンスフィールドは_every_インスタンスに追加メモリを割り当てます)。 @stephencのように、メソッドには違いはありません。 – Chadwick

1

私のコメントを詳しく説明します。

静的メソッドは、インスタンスがある場合は非静的メソッドを呼び出すことができます。

class A { 
    public void nonStaticMethod() { } 

    public static void staticMethod(String text) { 
     // calls non-static method on text 
     text.length(); 
     // calls non-static method on new Object 
     new Object().hashCode(); 
     // calls non static method on a instance of A 
     new A().nonStaticMethod(); 
    } 
} 
+1

私はあなたがポイントを参照してください、ありがとう。私はgoogle guiceを使用してオブジェクトインスタンスを作成し、コントローラ内で非静的関数を使用することができます – indrap

17

この質問はこれまで同様の方法で求められています。簡単な答えは、Playはそれが合理的な静的なものを使用するということです。

HTTPモデルはOOモデルではありません。 HTTP要求自体はステートレスなので、静的メソッドはクライアントコードからの機能要求としてコントローラにアクセスします。

一方、モデルクラスは純粋なOOであり、静的な重さではありません。 findAllやfindByIdなどのユーティリティメソッドの中には静的なものもありますが、これらは再びステートフルではなく、クラスのユーティリティメソッドです。とにかく私はこれを標準のOOモデルで期待しています。

したがって、私は、Playが期待している方法で何かをするリスクはないと思います。それは奇妙に見えるかもしれません。なぜなら、それは規範に挑戦するからです。

+4

これはPlay Frameworkに固有の正解です。 – Ryan

+1

Play Frameworkのクッキングブックの15ページから、作成者がこの問題を非常にうまく解決していることがわかりました(play.classloading。 enhancers.ControllerEnhancer) – indrap

+1

確かに彼はそうしました。ギョームは非常にスマートな男で、PlayチームはPlayの構造をとてもうまく設計しました。 – Codemwnci

関連する問題