2017-10-25 1 views
-1

Ich habe die Verwendung von Klassenübergaben als Parameter mehr und mehr gesehen. Ich frage mich, aus welchen Gründen jemand eine Anwendung entwerfen würde, um einen Klassentyp über eine Schnittstelle oder ein Objekt zu verwenden.Java OO Design: Warum sollten Sie einen Klassentyp über eine Schnittstelle oder ein Objekt übergeben?

einfach, warum:

someFunction(someclass.class); 

Over:

someFunction(new someclass()); 

wo einige Klasse ein konkretes Objekt ist someInterface umzusetzen.

+0

Da erstellt man eine Instanz von 'someclass', die andere nicht. Es wird sehr oft im Umgang mit Generika und Mapping verwendet. Beachten Sie, dass 'someclass.class' ebenfalls eine Instanz ist, eine Instanz von' Class'. – luk2302

+0

'new someclass()' ist ein Aufruf an einen Konstruktor. Niemand versichert Ihnen, dass dieser Konstruktor öffentlich ist oder dass er überhaupt existiert (es könnte einen Parameter erfordern). Warum würden Sie eine Instanz einer Klasse erstellen, wenn Sie nur den Typ benötigen? – Oneiros

+0

@ luk2302 Ja, explizit, aber Sie können den Klassentyp verwenden, um eine Klasse zu instanziieren. Meine Frage lautet also, warum der Klassentyp und nicht die Klasse oder irgendeine Schnittstellendarstellung der Klasse übergeben wird? Was sind die Vorteile der Weitergabe der Klasse? – user3416682

Antwort

0

Ich nehme ein Beispiel aus den Kommentaren: Warum SpringApplication.run(Application.class, args); anstelle von SpringApplication.run(this, args);?

Ich habe eigentlich Spring nicht verwendet, also bin ich mir nicht sicher, das ist eine korrekte Beschreibung wie Spring Dependency Injection aufruft, aber es sollte dazu dienen, die Frage unabhängig zu beantworten.

Zunächst wird diese Methode typischerweise von main aufgerufen. Genauer gesagt, von public static void main. Das ist eine static Methode, und this existiert nicht in denen. Also müsste es stattdessen SpringApplication.run(new Application(), args); sein.

Aber was, wenn der Konstruktor von Application wie public Application(Something dependency1, AnotherThing dependency2, SomethingElse dependency3) aussieht? Sie müssten jedes dieser Abhängigkeitsobjekte an erster Stelle setzen, und sie könnten auch ihre eigenen Abhängigkeiten haben. Sie würden diese riesige Sequenz von Dutzenden von Zeilen zum Erstellen neuer Objekte erhalten und sie an die Konstruktoren von mehr neuen Objekten übergeben.

SpringApplication.run(Application.class, args); ist eine einzige kurze Zeile, egal, was der Application Konstruktor aussieht, und es ist speziell entwickelt, um all diese Dutzende von erforderlichen Objekten für Sie herauszufinden und zu machen. Es schaut auf Application 's Konstruktor und sieht diese Liste von drei Argumenten, schaut sich diese Klassen an, findet ihre Konstruktoren, schaut sich die Argumentenlisten dieser Konstruktoren an, bis es genug Informationen hat, um das ganze große Chaos für Sie zusammen zu bringen. Alles aus einem kurzen Methodenaufruf. Das Erfordernis, dass Sie eine bereits erstellte Instanz von Application und nicht die Klasse übergeben, würde den Sinn verneinen, und die Klasse ist alles, was sie tatsächlich benötigt.

Es gibt sehr viele andere Dinge, die mit einer Klasse getan werden können, wo die Verwendung einer Instanz stattdessen unnötig wäre oder sogar die gewünschte Funktionalität tatsächlich bricht, dies ist nur ein Beispiel dafür.

+0

Danke, dass ich abstimmen würde, aber es lässt mich nicht. – user3416682

Verwandte Themen