Προγραμματισμός

Κοινή λειτουργικότητα αντικειμένου Java με το Project Lombok

Το Project Lombok είναι μια μικρή βιβλιοθήκη που μπορεί να χρησιμοποιηθεί για τη μείωση του όγκου του κώδικα λέβητα Java που συνήθως γράφεται για τάξεις Java. Το Project Lombok το κάνει μέσω σχολιασμών που μπορούν να προστεθούν στην κλάση Java για τις οποίες είναι επιθυμητές κοινές μέθοδοι. Τα περισσότερα από τα σχόλια είναι αυτο-περιγραφικά στα ονόματά τους: @Getter, @Setter, @EqualsAndHashCode, @ToString και @NoArgsConstructor είναι παραδείγματα. Σε αυτήν την ανάρτηση, αποδεικνύω ότι θα εφαρμόσω απλούς σχολιασμούς Lombok για να προσθέσω αυτές τις κοινώς γραμμένες μεθόδους σε μια τάξη Java.

Εδώ είναι μια απλή τάξη χωρίς προκαθορισμένη παρακαμμένη έκδοση του toString ().

toString-less Person.java

πακέτο dustin.example; / ** * Κατηγορία Simple Person χωρίς βραστήρα. * * @author Dustin * / Πρόσωπο δημόσιας τάξης {private String lastName; ιδιωτικό όνομα συμβολοσειράς; } 

Όταν δημιουργείται η παραπάνω κλάση και καλείται κληρονομικά (από το αντικείμενο) έως τη μέθοδο String (), η έξοδος μοιάζει με αυτήν που εμφανίζεται στην επόμενη εικόνα.

Θα μπορούσαμε να γράψουμε μια ρητή μέθοδο toString () ή να χρησιμοποιήσουμε το Project Lombok. Το επόμενο απόσπασμα κώδικα δείχνει την προσέγγιση Project Lombok.

Person.java με τον σχολιασμό @ToString του Lombok

πακέτο dustin.example; εισαγωγή lombok.ToString; / ** * Κατηγορία Simple Person χωρίς βραστήρα. * * @author Dustin * / @ToString δημόσια τάξη Πρόσωπο {private String lastName; ιδιωτικό όνομα συμβολοσειράς; } 

Η έξοδος από την εκτύπωση των περιεχομένων αυτής της κλάσης με το Lombok που παρέχεται στο String () εμφανίζεται στη συνέχεια.

Υπάρχει καλύτερη αναπαράσταση toString () του αντικειμένου Person τώρα, αλλά τα πεδία του δεν έχουν ακόμη αρχικοποιηθεί, οπότε βλέπουμε μόνο μηδενικές τιμές. Μπορούμε να χρησιμοποιήσουμε ξανά το Lombok για να δημιουργήσουμε τον κατασκευαστή.

Person.java με τον σχολιασμό @AllArgsConstructor της Lombok

πακέτο dustin.example; εισαγωγή lombok.AllArgsConstructor; εισαγωγή lombok.ToString; / ** * Απλή κατηγορία ατόμων χωρίς λέβητα. * * @author Dustin * / @ToString @AllArgsConstructor δημόσια τάξη Πρόσωπο {private String lastName; ιδιωτικό όνομα συμβολοσειράς; } 

Τώρα μπορώ (στην πραγματικότητα, πρέπει) να περάσω σε παραμέτρους κατά την παρουσίαση του αντικειμένου Person. Τα αποτελέσματα εμφανίζονται στην επόμενη εικόνα οθόνης. Σε αυτήν την περίπτωση, ο κωδικός πελάτη μου (Main.java) εμφανίζει σφάλμα χρόνου μεταγλώττισης στο NetBeans επειδή το NetBeans δεν πιστεύει ότι υπάρχει ένας κατασκευαστής στο Person που δέχεται δύο Strings Παρά τα κόκκινα σημάδια, ο κώδικας δημιουργείται όταν ζητώ από το NetBeans να το δημιουργήσει.

Μια κλάση όπως το Person.java είναι συχνά μια κλάση δεδομένων που θα πρέπει να χρησιμοποιηθεί σε συγκρίσεις και πιθανώς κλειδιά συλλογής που βασίζονται σε hashCode. Είναι σημαντικό να δημιουργήσετε σωστά τις υλοποιήσεις ίσων (Object) και hashCode () και να βεβαιωθείτε ότι έχουν δημιουργηθεί μαζί. Επειδή υπάρχουν προεπιλεγμένες μέθοδοι ίσες και hashCode που παρέχονται από τη γονική κλάση αντικειμένων, ο κώδικας Java που χρησιμοποιεί παρουσίες προσώπου θα μπορεί να εκτελεί ίσους ή / και hashCode, αλλά δεν είναι πιθανό να είναι αυτό που πραγματικά θέλει κάποιος. Όταν η κύρια εκτελέσιμη κλάση αλλάξει στην επόμενη λίστα κωδικών, βλέπουμε την έξοδο μετά από αυτήν που μας λέει ότι η σύγκριση ισότητας γίνεται εντελώς με βάση την ταυτότητα και όχι το περιεχόμενο.

Main.java That Tests ισούται με () Υλοποίηση

πακέτο dustin.example; εισαγωγή στατικού java.lang.System.out; / ** * Simple Main για χρήσεις Project Lombok. * * @author Dustin * / δημόσια τάξη Main {public static void main (final String [] επιχειρήματα) {// final Person person = new Person (); τελικό πρόσωπο πρόσωπο = νέο άτομο ("Miles", "Linda"); out.println (άτομο); final String sameLastName = "Smith"; final String sameFirstName = "Sam"; final Person person1 = νέο άτομο (sameLastName, sameFirstName); final Person person2 = νέο άτομο (sameLastName, sameFirstName); if (person1.equals (person2)) {out.println ("Ίδιο άτομο!"); } αλλιώς {out.println ("Διαφορετικοί άνθρωποι!"); }}} 

Αυτό σχεδόν ποτέ δεν είναι αυτό που ζητείται εδώ. Αντ 'αυτού, απαιτείται μια ρητή ισότητα εφαρμογής. Μου αρέσει το γεγονός ότι ο σχολιασμός Lombok για αυτό, @EqualsAndHashCode, δημιουργεί και τα δύο μόνο μαζί, επειδή δεν έχει νόημα να τα παρακάμψουμε μεμονωμένα. Η λίστα κατηγοριών Person.java εμφανίζεται στη συνέχεια με την προσθήκη του σχολιασμού @EqualsAndHashCode.

Person.java με @EqualsAndHashCode

πακέτο dustin.example; εισαγωγή lombok.AllArgsConstructor; εισαγωγή lombok.EqualsAndHashCode; εισαγωγή lombok.ToString; / ** * Απλή κατηγορία ατόμων χωρίς λέβητα. * * @author Dustin * / @ToString @AllArgsConstructor @EqualsAndHashCode δημόσια τάξη Πρόσωπο {private String lastName; ιδιωτικό όνομα συμβολοσειράς; } 

Η έξοδος είναι καλύτερη τώρα.

Δεν έχω ακόμα καλό τρόπο να έχω πρόσβαση σε κάθε δημόσιο πεδίο ξεχωριστά αν χρειαστεί. Για παράδειγμα, αν ήθελα να κάνω κάτι στον κωδικό μου με βάση το επώνυμο, δεν έχω καλό τρόπο να το κάνω χωρίς να κάνω δραστικά βήματα. Μπορώ να χρησιμοποιήσω ξανά το Lombok εδώ.

Για αυτό το παράδειγμα, θα υποθέσουμε ότι κάναμε μια λανθασμένη υπόθεση ότι μόνο το επώνυμο του ατόμου μπορεί να αλλάξει. Λόγω αυτής της υπόθεσης, θα παρέχουμε μόνο έναν σχολιασμό Lombok @Setter για το επώνυμο, αλλά θα παρέχουμε έναν σχολιασμό @Getter και για τα δύο πεδία. Ο αλλαγμένος κωδικός προσώπου εμφανίζεται στη συνέχεια.

Person.java με @Getter και @Setter

πακέτο dustin.example; εισαγωγή lombok.AllArgsConstructor; εισαγωγή lombok.EqualsAndHashCode; εισαγωγή lombok.Getter; εισαγωγή lombok.Setter; εισαγωγή lombok.ToString; / ** * Κατηγορία Simple Person χωρίς βραστήρα. * * @author Dustin * / @ToString @AllArgsConstructor @EqualsAndHashCode δημόσια τάξη Πρόσωπο {@Getter @Setter private String lastName; @Getter private String firstName; } 

Εδώ είναι η ενημερωμένη κύρια τάξη για να εκτελέσετε αυτό το παράδειγμα:

Main.java που χρησιμοποιεί το νέο Setter / Getter

πακέτο dustin.example; εισαγωγή στατικού java.lang.System.out; / ** * Simple Main για χρήσεις Project Lombok. * * @author Dustin * / δημόσια τάξη Main {public static void main (final String [] επιχειρήματα) {// final Person person = new Person (); τελικό πρόσωπο πρόσωπο = νέο άτομο ("Miles", "Linda"); out.println (άτομο); final String sameLastName = "Smith"; final String sameFirstName = "Sam"; final Person person1 = νέο άτομο (sameLastName, sameFirstName); final Person person2 = νέο άτομο (sameLastName, sameFirstName); if (person1.equals (person2)) {out.println ("Ίδιο άτομο!"); } αλλιώς {out.println ("Διαφορετικοί άνθρωποι!"); } τελικό Πρόσωπο προσβάσιμοPerson = νέο άτομο ("Garzminski", "Gary"); out.println ("Το επώνυμο είναι" + accessPerson.getLastName ()); out.println ("Το όνομα είναι" + accessPerson.getFirstName ()); //accessiblePerson.setFirstName("Grady "); προσβάσιμοPerson.setLastName ("Garfunkel"); out.println ("Το νέο επώνυμο είναι" + accessPerson.getLastName ()); }} 

Έπρεπε να σχολιάσω την κλήση για να ορίσω το όνομα του ατόμου έτσι ώστε ο κώδικας να δημιουργηθεί. Τρέχει τώρα όπως φαίνεται στο επόμενο στιγμιότυπο οθόνης.

Είναι πιθανό αυτή η συλλογή σχολιασμών του Lombok να είναι συνήθως επιθυμητή, ειδικά για τάξεις με γνώμονα τα δεδομένα. Για το λόγο αυτό, το Project Lombok παρέχει συγκεντρωτικούς σχολιασμούς όπως το @Data που παρέχουν μια συλλογή αυτών των σχολιασμών. Σε αυτήν την περίπτωση, θα μπορούσα να είχα πολύ παρόμοια συμπεριφορά με τους διάφορους μεμονωμένους σχολιασμούς που παρείχα χρησιμοποιώντας το @Data. Ο σχολιασμός @Data οδηγεί στο Lombok εφαρμόστε το @Getter σε όλα τα πεδία και το @Setter σε όλα τα μη τελικά πεδία. Η άλλη σημαντική διαφορά από αυτό που χρησιμοποίησα είναι ότι χρησιμοποιεί το @RequiredArgsConstructor και όχι το @AllArgsConstructor.

Ένας από τους καλύτερους τρόπους για να δείτε τι έχει κάνει το Project Lombok στο μεταγλωττισμένο αρχείο .class είναι να χρησιμοποιήσετε το javap. Αυτό εμφανίζεται στο επόμενο στιγμιότυπο οθόνης.

Βλέπουμε σε αυτήν την έξοδο ότι ένα σωρό από τις μεθόδους που συνήθως φαίνονται ένας boilerplate κωδικός είναι διαθέσιμος στο μεταγλωττισμένο Person.class Υπάρχει ένας παράμετρος κατασκευαστή δύο ορίων, hashCode (), ίσο με (Object), toString () και τις αναμενόμενες μεθόδους λήψης και ρύθμισης

Το Project Lombok δεν είναι χωρίς ανησυχίες και περιορισμούς. Πολλά από αυτά διατυπώνονται σε απαντήσεις στην ανάρτηση του Hamlet D'Arcy, Java Without the Boilerplate - Project Lombok. Ένας περιορισμός είναι η μειωμένη υποστήριξη σε IDE εκτός του Eclipse (αν και υπάρχει αξιοπρεπής υποστήριξη NetBeans και υποστηρίζεται javac). Μια ανησυχία είναι ότι οι άλλοι χρησιμοποιούν και διατηρούν τον κώδικα να έχουν μια νέα εξάρτηση από το Lombok. Αυτή η ανησυχία μπορεί να μετριαστεί κάπως με τη χρήση του delombok, το οποίο θα μπορούσε να χρησιμοποιηθεί στη διαδικασία κατασκευής εάν είναι απαραίτητο.

Άλλα άρθρα και αναρτήσεις ιστολογίου που καλύπτουν το Project Lombok περιλαμβάνουν το Project Lombok - Ποτέ μην γράφετε ξανά το Java Boilerplate Code, Java Without the Boilerplate - Project Lombok, Project Lombok: Bye Bye Boilerplate, Java Posse's Project Lombok Interview, Project Lombok: Put a End to Java Verbosity , Project Lombok - A Must-Have in Your Java Toolkit, Project Lombok: Ενδιαφέρουσες συντομεύσεις φασολιών με επεξεργαστή σχολιασμού, συνέντευξη: Reinier and Roel on Lombok, Reducing Boilerplate Code with Project Lombok, Rapid Development with Lombok, Lombok Reduces Your Boilerplate Code και Καλύτερη εναλλακτική λύση για Getters and Setters.

Αυτή η ιστορία, "Common Java Object Functionality with Project Lombok" δημοσιεύθηκε αρχικά από την JavaWorld.