Sind Sie in Java immer noch unverändert, neue entsprechende Objekte für die Instanziierung der Klasse?
Mit mehr Projekten in der Hand wird die Menge an Code schreiben, und allmählich spüren Sie das Designmuster.
Wie kann ich die geschriebenen Klassen -Instanziierungsaktionen, hohe Zusammenhalt, niedrige Kopplung und bestimmte Expansionsfunktionen durchführen?
Dieser Artikel versucht, mit einigen lebhaften Codes zu beginnen, um allen verschiedenen Java -Instanziierungsklassen vorzulegen.
Der folgende Code stammt aus der Implementierung von Com.google.zxing -Quellcode:
public bitmatrix codieren (String -Inhalt, BarcodeFormat -Format, int width, inthohe, map <encodeHintType,?> Hinweise) löst WriteRexception {Object Writer; switch (format.ordinal ()) {case 1: writer = new aztecwriter (); brechen; Fall 2: writer = neuer codabarwriter (); brechen; Fall 3: writer = new code39Writer (); brechen; Fall 4: Fall 10: Fall 13: Fall 14: Standard: Werfen Sie neue IllegalArgumentException ("Kein Encoder für das Format verfügbar" + Format); Fall 5: Writer = New Code128Writer (); brechen; Fall 6: writer = new DatamatrixWriter (); brechen; Fall 7: writer = new EAN8Writer (); brechen; Fall 8: writer = new EAN13Writer (); brechen; Fall 9: writer = new itfWriter (); brechen; Fall 11: Writer = New PDF417Writer (); brechen; Fall 12: writer = new QrCodewriter (); brechen; Fall 15: writer = new upcawriter (); brechen; Fall 16: writer = new upcewriter (); } return ((Schriftsteller) Schriftsteller) .Codode (Inhalt, Format, Breite, Höhe, Hinweise); }Der BarcodeFormat ist so:
public enum BarcodeFormat { AZTEC, CODABAR, CODE_39, CODE_93, CODE_128, DATA_MATRIX, EAN_8, EAN_13, ITF, MAXICODE, PDF_417, QR_CODE, RSS_14, RSS_EXPANDED, UPC_A, UPC_E, UPC_EAN_EXTENSION; private barcodeFormat () {}} Die vom Quellcode bereitgestellte Funktion besteht darin, Informationen über verschiedene Arten von Barcode -Drahtern in eine Bitmatrix auszugeben und sie dann auf das Bild auszugeben, um verschiedene Arten von Barcodes zu bilden, die überall zu sehen sind.
Bitmatrix bitmatrix = new multiformatWriter (). Codode (_text, barcodeFormat.qr_code, QrCodeWidth, QrcodeHeight, Tipps);
MatrixtoimageWriter.Writetofile (Bitmatrix, QrcodeFormat, QrcodeFile);
Der Quellcode -Autor verwendet die neue Funktion Enum -Klasse, die hier in JDK 1.5 eingeführt wurde, und schrieb die BarcodeFormat -Klasse, die die Eigenschaften verschiedener Arten von Barcodes definiert.
Rufen Sie MultiformatWriter.Encode () auf, um die spezifische Klasse gemäß der Sequenznummer des Parameter barcodeFormat.xx in der Aufzählungsklasse zu instanziieren.
switch (format.ordinal ()) {case 1: writer = new aztecwriter (); brechen; Fall 2: writer = neuer codabarwriter (); brechen; Fall 3: writer = new code39Writer (); brechen; ............ Diese Barcode -Autorklassen implementieren zwei codes () -Methoden des abstrakten Schnittstellenschreibers.
public interface writer {bitmatrix codieren (String var1, barcodeFormat var2, int var3, int var4) löst WriteRexception aus; Bitmatrix codieren (String var1, barcodeFormat var2, int var3, int var4, map <encodeHintType,?> Var5) löscht WriteRexception aus;}Die spezifische Barcode -Drahtklasse führt unterschiedliche Logik aus, basierend auf verschiedenen Arten von Barcode -Regeln.
Benutzer müssen der internen Implementierung nicht zu viel Aufmerksamkeit schenken. Sie müssen generieren, welche Art von Barcode sie auswählen und den entsprechenden Barcode -Typ verwenden müssen. Die obigen Beispiele werden im QR -Code implementiert.
Schauen wir uns einen Methodencode für die dynamische Instanziierungsklasse des klassischen MVC Framework -Webwork an:
private statische Konfiguration getDefaultConfiguration () {if (defaultImpl == null) {defaultImpl = new DefaultConfiguration (); try {string className = getString ("webwork.configuration"); if (! className.equals (defaultImpl.getClass (). getName ()) {try {defaultImpl = (configuration) ObjectFactory.getObjectFactory (). BuildBean (Thread.currentThread (). getContextClassloader (). loadClass (classname)); } catch (Ausnahme E) {log.Error ("konnte die Konfiguration nicht instanziieren", e); }} return defaultImpl; } catch (illegalArgumentException localilegalArgumentException) {}}}Der Quellcode stammt aus Webwork-Core. Viele Zuschauer haben vielleicht nicht von Webwork gehört, aber Struts sollten bekannt sein. Struts2 Core wird aus Webwork umgeschrieben.
Die vom oben genannte Quellcode bereitgestellte Funktion besteht darin, die vom Benutzer definierte Konfigurationsdateiklasse zu instanziieren, und die Definition befindet sich in der Konfigurationsdatei.
Der Quellcode -Autor verwendet thread.currentThread (). GetContextClassloader (). LoadClass (ClassName) -Loader im Thread, um benutzerdefinierte Konfigurationsdatei -Klassen zu lesen, was der effizienteste ist.
Delegate -Kette des Klassenlader
Der Klassenloader auf der linken Seite der Delegationskette kann die vom Klassenloader auf der rechte Klasse geladene Klasse natürlich verwenden. Der Klassenbeladungsmechanismus besteht darin, festzustellen, ob er die Klasse lädt und den Vorgesetzten nicht verlangt.
Diese drei Klassenlader entsprechen der Priorität des Compilers und unterschiedlichen Pfaden, um die Klassendatei zu finden:
Class.Forname (), das in täglichen Projekten verwendet wird, werden vom BootstrapClassloader gefragt, was am meisten ressourcengebunden ist.
Der Quellcode -Autor verwendet hier einen Thread -Klasse -Loader, der dem SystemClassloader entspricht, der zweifellos die höchste Effizienz ist.