2017-07-16 6 views
-2

Es ist möglich, Schnittstellen automatisch in konkrete Klassen auflösen zu lassen?Automatisches Auflösen von Schnittstellen in konkrete Klassen auf Java

Zum Beispiel, ich habe eine Datenbank-Schnittstelle und zwei konkrete Klassen, SqlServer und Postgre. Wenn meine Anwendung startet, möchte ich Datenbank aufrufen, aber Anwendung muss mir SqlServer oder Postgre abhängig von meiner Konfiguration geben.

+0

Konfigurations- und Injektionsabhängigkeit kann die Aufgabe erledigen. – davidxxx

+0

Dies ist eine ziemlich einfache und umfassende Sache, die eine App zu tun hat. –

+0

@davidxxx kannst du mir bitte ein Exemplar geben? –

Antwort

-2

Erstellen Sie ein Objekt der Klasse, die die Datenbankschnittstellenreferenz enthalten soll, und übergeben Sie diese als Parameter/Dependency Injection. ZB: Erstellen Sie ein Objekt von SqlServer, wenn Sie das Objekt SqlServer benötigen, und übergeben Sie dieses Objekt dann an Database Interface reference.

class MyClass{ 

    public static void main(String[] args) { 
     SqlServer sqlServer = new SqlServer(); 
     MyClass.start(sqlServer); 
    } 

    public static void start(Database database) { 
     System.out.println(database.getClass()); 
    } 
} 

interface Database{} 

class SqlServer implements Database{} 

OUTPUT:

SqlServer 
+0

verwenden, wie hängt es mit der Frage zusammen? Warum kann dieses Beispiel OP helfen? – Andrew

+0

Wie geht das nicht? Das OP bat darum, 'Database' aufzurufen, aber die App muss ihm eine angemessene Bindung geben. Ich antwortete mit einem Beispiel, wie es gemacht werden kann. Auch in seiner App muss er es von irgendwo weitergeben. –

+0

Aber wenn ich meine Datenbank zu Postgre ändere, wird es notwendig sein, alle Verweise auf meinen Code zu Postgre Klasse zu ändern.Das Ziel, eine Schnittstelle automatisch zur abstrakten Klasse aufzulösen, besteht darin, dieses Problem zu vermeiden. –

1

Sie sprechen über Inversion of Control in Ihre App enthält. Hier, ich denke du suchst Dependency Injection. Sie können die DI des Poor Man tun, wie in der anderen Antwort beschrieben, ist eine Option und erfordert keine 3rd Party Libs. Es liegt an dir. Sie müssen es nur mit Hilfe eines Konfigurationsparsers verbinden.

Ich sollte auch das Factory Pattern erwähnen (während einige als ein Anti-Pattern betrachtet werden, und ich stimme zu), die in der Java-Community sehr populär zu sein scheint.

0

Sie könnten Java SPI (Service Provider Interface) verwenden.

Sie zwei verschiedene Gläser machen, die die Schnittstelle xx.yy.Database

Sie setzen haben eine Textdatei META-INF/services/xxx.yyy.Database mit:

uuu.vvv.Postgre 

oder

www.xxx.SqlServer 

Angabe von implementierenden Klassen der Schnittstelle.

Durch Hinzufügen von eins zum Klassenpfad Ihrer Anwendung wird eine Implementierung der Schnittstelle unter Verwendung einer ServiceLoader gefunden.

ServiceLoader<Database> loader = ServiceLoader.load(Database.class); 
Database db = loader.iterator().next(); 
Verwandte Themen