2017-10-25 5 views
-1

私はパラメータとしてクラス型をますます渡すことの使用を見てきました。私は、誰かがインタフェースやオブジェクトに対してクラス型を使うようにアプリケーションを設計する理由が何であるか疑問に思っています。Java OO設計:インタフェースやオブジェクトにクラス型を渡す理由を選択してください。

単に理由:

someFunction(someclass.class); 

オーバー:

someFunction(new someclass()); 

いくつかのクラスがsomeInterfaceを実装し、具体的なオブジェクトです。

+0

「someclass」のインスタンスを作成するため、もう一方は作成しないためです。これは、ジェネリックとマッピングを扱うときに非常によく使用されます。 'someclass.class'はインスタンスでもあり、' Class'のインスタンスです。 – luk2302

+0

'新しいsomeclass()'はコンストラクタへの呼び出しです。そのコンストラクタがパブリックであるか、それが存在する(パラメータが必要な場合もある)ことを誰も保証しません。なぜ型が必要なときにクラスのインスタンスを作成するのですか? – Oneiros

+0

@ luk2302はい、明示的には話しますが、クラスタイプを使用してsomeclassをインスタンス化できます。だから私の質問はなぜクラスの型ではなく、クラス、またはクラスのいくつかのインターフェイス表現を渡す立場ですか? .classを渡すことのメリットは何ですか? – user3416682

答えて

0

私はコメントから例を挙げる:SpringApplication.run(this, args);の代わりにSpringApplication.run(Application.class, args);を入力してください。

Springは実際にはSpringを使用していないので、Springが依存性注入をどのように呼び出すのかは正確にはわかりませんが、質問に無関係に回答する必要があります。

まず、このメソッドはmainから呼び出されます。詳細はpublic static void mainからです。これはstaticメソッドであり、thisはそのメソッドには存在しません。したがって、代わりにSpringApplication.run(new Application(), args);にする必要があります。

しかし、Applicationのコンストラクタがpublic Application(Something dependency1, AnotherThing dependency2, SomethingElse dependency3)のように見える場合はどうなりますか?それらの依存オブジェクトのそれぞれを最初に作成しなければならないし、独自の依存関係も持つ必要があります。あなたは、新しいオブジェクトを作成し、より新しいオブジェクトのコンストラクタに渡すという、数十行のこの巨大なシーケンスで終わるでしょう。

SpringApplication.run(Application.class, args);は、Applicationコンストラクタがどのようなものであっても単一の短い行であり、必要なオブジェクトを何十個も見つけ出して作成するように特別に設計されています。それはApplicationのコンストラクタを見て、3つの引数のリストを見て、それらのクラスを見て、それらのコンストラクタを見つけ、それらのコンストラクタの引数リストを見て、すべての短いメソッド呼び出しから。クラスではなく、すでに作成されているApplicationのインスタンスを渡すことを要求すると、このクラスのポイントは無効になり、クラスは実際に必要です。

代わりにインスタンスを使用する必要がなく、実際には目的の機能を破棄するクラスでは、他にもたくさんのことがありますが、これはその一例です。

+0

ありがとうございます。私は投票をしようとしましたが、それは私を許さないでしょう。 – user3416682