En Java, êtes-vous toujours inchangé de nouveaux objets correspondants pour instanier la classe?
Avec plus de projets en main, la quantité d'écriture de code augmentera naturellement, et progressivement vous ressentirez le modèle de conception.
Comment effectuer les actions d'instanciation de classe écrite, une cohésion élevée, un couplage faible et avoir certaines capacités d'expansion?
Cet article essaie de commencer avec quelques codes vifs pour présenter différentes classes d'instanciation Java à tout le monde.
Le code suivant est tiré de la mise en œuvre du code source com.google.zxing:
Encode BitMatrix public (contenu de chaîne, format BarcodeFormat, intr, int hauteur, map <encodeHintType ,?> Insigne) lève WriteReXception {Object Writer; switch (format.Ordial ()) {cas 1: writer = new aztecwriter (); casser; Cas 2: écrivain = new CodabarWriter (); casser; Cas 3: écrivain = new Code39Writer (); casser; Cas 4: Cas 10: Cas 13: Cas 14: Par défaut: Jetez un nouveau format illégalArgumentException ("Aucun encodeur disponible pour le format" + format); Cas 5: écrivain = new Code128Writer (); casser; Cas 6: écrivain = nouveau dataMatrixWriter (); casser; Cas 7: écrivain = new ean8writer (); casser; Cas 8: écrivain = new ean13writer (); casser; Cas 9: écrivain = nouveau itfwriter (); casser; Cas 11: écrivain = nouveau PDF417Writer (); casser; Cas 12: écrivain = new QrCodeWriter (); casser; Cas 15: écrivain = new UpCawriter (); casser; Cas 16: écrivain = new UpceWriter (); } return ((écrivain) écrivain) .encode (contenu, format, largeur, hauteur, indices); }Le BarcodeFormat est comme ceci:
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; BarcodeFormat privé () {}} La fonction fournie par le code source consiste à produire des informations dans une matrice de bits via plusieurs types de puissants de codes à barres, puis à le publier sur l'image pour former différents types de codes à barres qui peuvent être vues partout.
BitMatrix BitMatrix = new MultiformatWriter (). Encode (_Text, BarcodeFormat.qr_code, qrcodewidth, qrcodeheight, indices);
MatrixToimageWriter.WriteToFile (BitMatrix, QRCodeFormat, QRCodeFile);
L'auteur du code source utilise la nouvelle classe Enum Enum Classe introduite dans JDK 1.5 ici et a écrit la classe BarcodeFormat, qui définit les propriétés de différents types de codes à barres.
Appelez MultiformatWriter.Encode () pour instancier la classe spécifique en fonction du numéro de séquence du paramètre BarcodeFormat.xx dans la classe d'énumération.
switch (format.Ordial ()) {cas 1: writer = new aztecwriter (); casser; Cas 2: écrivain = new CodabarWriter (); casser; Cas 3: écrivain = new Code39Writer (); casser; ............ Ces classes d'écrivain à barres implémentent deux méthodes Encode () d'écrivain d'interface abstraite.
Public Interface Writer {BitMatrix Encode (String Var1, BarcodeFormat var2, int var3, int var4) lève WriteRException; BitMatrix Encode (String var1, BarcodeFormat var2, int var3, int var4, map <EncodeHintType ,?> var5) lève la réserexception;}La classe Wirter de code-barres spécifique effectue différentes logiques en fonction de différents types de règles de code-barres.
Les utilisateurs n'ont pas besoin de prêter trop d'attention à l'implémentation interne. Ils doivent générer le type de code-barres dont ils ont besoin pour choisir et utiliser le type de code-barres approprié. Les exemples ci-dessus sont implémentés dans le code QR.
Regardons un code de méthode pour la classe d'instanciation dynamique du webwork Classic MVC Framework:
Configuration statique privée getDefaultConfiguration () {if (defaultIMPl == null) {defaultIMPL = new defaultConfiguration (); essayez {string className = getString ("webwork.configuration"); if (! className.equals (defaultImpl.getClass (). getName ())) {try {defaultIMPL = (Configuration) objectFactory.getObjectFactory (). BuildBean (Thread.CurrentThread (). GetContextClassLoDer (). LoadClass (className)); } catch (exception e) {log.Error ("n'a pas pu instancier la configuration", e); }} return defaultIMPL; } catch (illégalargumentException localillegalargumentException) {}}}Le code source est tiré de la webwork-core. De nombreux spectateurs n'ont peut-être pas entendu parler de webwork, mais les entretoises devraient être bien connues. Struts2 Core est réécrit à partir du travail Web.
La fonction fournie par le code source ci-dessus consiste à instancier la classe de lecture de fichiers de configuration définie par l'utilisateur, et la définition se trouve dans le fichier de configuration.
L'auteur du code source utilise thread.currentThread (). GetContextClassloader (). LoadClass (className) Class Loder in Thread pour instancier dynamiquement les classes de lecture de fichiers de configuration personnalisées, ce qui est le moyen le plus efficace.
Chaîne déléguée de chargeur de classe: SystemClassloader -> ExtensionClassloader -> BootstrapClassloadher
Le chargeur de classe sur le côté gauche de la chaîne de délégation peut naturellement utiliser la classe chargée par le Classloader à droite. Le mécanisme de chargement de la classe est de déterminer s'il charge la classe, et il ne demande pas au supérieur.
Ces trois chargeurs de classe correspondent à la priorité du compilateur et à différents chemins de main pour trouver le fichier de classe:
CLASS.FORNAME () utilisé dans les projets quotidiens commencera à demander à BootstrapClassloader, qui est le plus consommateur de ressources.
L'auteur du code source utilise ici un chargeur de classe de threads, correspondant à SystemClassloader, qui est sans aucun doute l'efficacité la plus élevée.