Στην Java, μια τάξη singleton είναι μια τάξη που μπορεί να έχει μόνο μία παρουσία σε μια δεδομένη στιγμή. Είναι ένα από τα πέντε σχέδια δημιουργικής σχεδίασης στην Java που βοηθούν στην αβίαστη ανάπτυξη του . Μέσω του μέσου αυτού του άρθρου, θα σας δώσω σαφείς πληροφορίες σχετικά με το τι είναι μια μοναδική τάξη στην Java και πώς μπορείτε να τη δημιουργήσετε.
Ακολουθούν τα θέματα που θα καλύψω σε αυτό το άρθρο:
Ας αρχίσουμε.
Τι είναι μια τάξη Singleton στην Java;
Σε απλούς όρους, μια τάξη Singleton στην Java είναι η τάξη που επιτρέπει την πρόσβαση σε αυτήν μέσω μίας παρουσίας κάθε φορά. Αυτό το σχέδιο σχεδίασης προορίζεται για τον περιορισμό της περιττής παρουσίας μιας κλάσης και για τη διασφάλιση ότι μόνο μία υπάρχει ανά πάσα στιγμή ανά παρουσία JVM. Έτσι, με αυτό το μοτίβο, κάθε κλάση που ορίζεται ως Singleton έχει μόνο μία παρουσίαμε ένα παγκόσμιο σημείο πρόσβασης σε αυτό. Σε αντίθεση με τις κανονικές τάξεις, μια τάξη singleton δεν καταστρέφεται μέχρι το τέλος του κύκλου ζωής των εφαρμογών.
Γιατί, λοιπόν, χρειαζόμαστε την πρώτη τάξη Singleton;
Λοιπόν, με τον περιορισμό της δημιουργίας παρουσίας μιας κλάσης εξοικονομεί χώρο μνήμης, καθώς τώρα το αντικείμενο δεν θα δημιουργείται κάθε φορά που υποβάλλεται ένα νέο αίτημα. Αντ 'αυτού, ένα μεμονωμένο αντικείμενο θα χρησιμοποιηθεί επανειλημμένα. Αυτός είναι ο λόγος που χρησιμοποιείται το μοτίβο Singleton στην Java και εφαρμογές βάσεων δεδομένων. Χρησιμοποιείται βασικά για καταγραφή, προσωρινή αποθήκευση, συγκέντρωση νημάτων, ρυθμίσεις διαμόρφωσης και πολλά άλλα.
class vs interface στο java
Ελπίζω να είστε ξεκάθαροι με την ιδέα της κατηγορίας Singleton στην Java. Λοιπόν, ας προχωρήσουμε τώρα περαιτέρω σε αυτόΆρθρο Singleton Class in Java και δείτε πώς δημιουργούνται.
Τρόποι σχεδιασμού μιας τάξης Singleton Java
Για να φτιάξετε ένα μαθήμα στην Java, χρειάζεστε τα ακόλουθα τρία πράγματα:
- στατικό μέλος μιας τάξης
- ιδιωτικός κατασκευαστής
- στατική εργοστασιακή μέθοδος
Δεδομένου ότι η Java επιτρέπει στους προγραμματιστές να εξερευνήσουν τους ορίζοντές τους, υπάρχουνδιάφορους τρόπους με τους οποίους μπορείτε να σχεδιάσετε μια τάξη Singleton. Παρακάτω παραθέτω τα πιο δημοφιλή.
- Eager μέθοδος αρχικοποίησης
- Μέθοδος Lazy Initialization
- Μέθοδος ασφαλούς νήματος
- Lazy Initialization με τη μέθοδο διπλού κλειδώματος
- Μέθοδος Lazy Load
- Μέθοδος αρχικοποίησης στατικού μπλοκ
Ας δούμε τώρα βαθύτερα σε καθεμία από αυτές τις προσεγγίσεις μία προς μία.
1. Πρόθυμη μέθοδος αρχικοποίησης
Αυτή είναι η ευκολότερη μέθοδος δημιουργίας μιας τάξης Singleton όπου η παρουσία δημιουργείται κατά τη φόρτωση της τάξης. Για να δημιουργήσετε μια τάξη singleton χρησιμοποιώντας αυτήν τη μέθοδο, πρέπει να ακολουθήσετε τα παρακάτω βήματα:
- Δηλώστε τον κατασκευαστή ως ιδιωτικό.
- Το επόμενο βήμα είναι να δημιουργήσετε ένα μέλος της ιδιωτικής τάξης για αυτήν την τάξη Singleton.
- Τώρα, πρέπει να ορίσετε μια εργοστασιακή μέθοδο που θα χρησιμοποιηθεί για την επιστροφή του αντικειμένου της τάξης σας, που έχουμε δημιουργήσει ως παρουσία του μέλους της τάξης.
- Μπορείτε ακόμη και να δηλώσετε ένα στατικό μέλος δημόσιο εάν θέλετε να αποκτήσετε απευθείας πρόσβαση σε αυτήν τη στατική παρουσία.
Τώρα, ας δούμε πώς να τα εφαρμόσουμε.
// Eager Initialization δημόσια τάξη EagerSingleton {ιδιωτικό στατικό τελικό EagerSingleton INSTANCE = νέο EagerSingleton () ιδιωτικό EagerSingleton () {} δημόσια στατική EagerSingleton getInstance () {return INSTANCE}}
Εάν δείτε τον κωδικό, μπορείτε να παρατηρήσετε ότι κάθε φορά που δημιουργούμε ένα αντικείμενο χρησιμοποιούμε τοgetInstance ()μέθοδο και όχι επίκληση της τάξης οικοδόμος .Αλλά έχει τα μειονεκτήματά του. Εάν χρησιμοποιείτε αυτήν τη μέθοδο για να φτιάξετε μια κατηγορία, τότε θα δημιουργηθεί μια παρουσία ανεξάρτητα από το εάν η εφαρμογή τη χρησιμοποιεί ή όχι.
Ας προχωρήσουμε λοιπόν και να δούμε έναν άλλο τρόπο δημιουργίας ενός μαθήματος singleton στην Java.
2. Μέθοδος Lazy Initialization
Αυτή η μέθοδος ονομάζεται τεμπέλης αρχικοποίηση επειδή αναβάλλει τη δημιουργία της παρουσίας τάξης έως την πρώτη χρήση της. Αυτό που εννοώ είναι ότι, με αυτήν τη μέθοδο, ένα αντικείμενο δημιουργείται μόνο εάν χρειάζεται. Βοηθά στην αποφυγή περιττής δημιουργίας του . Για να σχεδιάσετε μια τάξη singleton με αυτόν τον τρόπο, πρέπει να ακολουθήσετε τα παρακάτω βήματα:
- Πρώτα απ 'όλα, δηλώστε τον κατασκευαστή ως ιδιωτικό.
- Στη συνέχεια, πρέπει να δημιουργήσετε μια ιδιωτική στατική παρουσία για αυτήν την τάξη, αλλά δεν χρειάζεται να την δημιουργήσετε ακόμη.
- Τέλος, δημιουργήστε μια εργοστασιακή μέθοδο που θα ελέγξει πρώτα αν το μέλος εμφάνισης είναι μηδενικό ή όχι. Εάν όχι τότε θα δημιουργήσει μια παρουσία της τάξης singleton για εσάς και θα την επιστρέψει.
Ο παρακάτω κώδικας δείχνει πώς να το κάνετε αυτό.
// Lazy Initialization δημόσια τάξη LazySingleton {private static LazySingleton INSTANCE = null private LazySingleton () {} δημόσια στατική LazySingleton getInstance () {if (INSTANCE == null) {synchronized (LazySingleton.class) {INSTANCE = νέο LazySingleton () επιστροφή INSTANCE}}
3. Νήμα Safe Singleton Μέθοδος
Ωστόσο, η παραπάνω προσέγγιση μπορεί να εγείρει ορισμένες ανησυχίες στα ταυτόχρονα σενάρια. Δεδομένου ότι το μοτίβο singleton χρησιμοποιείται κυρίως με πολλά νήματα και εάνΠολλά νήματα εισάγουν την κατάσταση if ταυτόχρονα μπορεί να δημιουργήσουν προβλήματα. Για να το αποφύγουμε αυτό, προσπαθούμε να δημιουργήσουμε μια τάξη singleton που είναι ασφαλής για νήματα κάνοντας τη μέθοδο παγκόσμιας πρόσβασης συγχρονισμένη. Αυτό διασφαλίζει ότι μόνο ένα νήμα εκτελεί αυτήν τη μέθοδο ανά πάσα στιγμή. Ανατρέξτε στον παρακάτω κώδικα για να δείτε την εφαρμογή:
// Thread Safe Singleton δημόσια τάξη ThreadSafeSingleton {ιδιωτικό στατικό ThreadSafeSingleton INSTANCE ιδιωτικό ThreadSafeSingleton () {} δημόσιο στατικό συγχρονισμένο ThreadSafeSingleton getInstance () {if (INSTANCE == null) {INSTANCE = νέο ThreadSafeSingleton ()} επιστροφή INSTANCE
Αλλά μερικές φορές αυτή η προσέγγιση μπορεί επίσης να γίνει πολύ δυσκίνητη καθώς κάθε φορά η μέθοδοςγίνεται επίκληση, πρέπει να περιμένει να απελευθερωθεί το κλείδωμα προτού η μέθοδος μπορεί να τη χρησιμοποιήσει. Αυτό οδηγεί σε επιβράδυνση της διαδικασίας και μας οδηγεί στην επόμενη προσέγγιση που είναιLazy Initialization με Double Lock.
4. Lazy Initialization με διπλό κλείδωμα Μέθοδος
Σε αυτήν την προσέγγιση, δεν συγχρονίζουμε τις μεθόδους. Αντίθετα, τυλίγουμε τον κώδικα δημιουργίας αντικειμένων μέσα σε ένα συγχρονισμένο μπλοκ.Μπορείτε να το πείτε αυτό ελέγχοντας εκ των προτέρων τις κλειδαριές νήματοςμειώνει τον αριθμό των εξαγορών κλειδώματος. Αυτή η προσέγγιση συνήθως οδηγεί σε αύξηση της απόδοσης της εφαρμογής. Ελέγξτε τον παρακάτω κώδικα για να δείτε πώς γίνεται.
// Lazy Initialization with Double Lock δημόσια τάξη LazyDoubleLockSingleton {private static LazyDoubleLockSingleton INSTANCE = null private LazyDoubleLockSingleton () {} δημόσιο στατικό LazyDoubleLockSingleton getInstance () {if (INSTANCE == null) {synchronized (LazyDoubleLock) null) {INSTANCE = νέο LazyDoubleLockSingleton ()}}} επιστροφή INSTANCE}}
5. Μέθοδος Lazy Load
Αυτή η μέθοδος βασίζεται στο JSL (Java Language Specification) και σύμφωνα με αυτό θα φορτώσει μέλη στατικών δεδομένων μόνο όταν απαιτούνται. Έτσι, όταν η τάξη των singleton σας φορτώνεται στο JVM, δεν δημιουργείται καμία παρουσία. Επιπλέον, κατά την εκτέλεση του προγράμματος, η καθολική μέθοδος καλείται με διαδοχική σειρά. Με αυτήν τη μέθοδο, δεν χρειάζεται να συγχρονίσετε ρητά το στατικό getInstance () για φόρτωση και αρχικοποίηση. Το μέλος της στατικής τάξης θα κληθεί με τον σωστό διαδοχικό τρόπο, τα υπόλοιπα ταυτόχρονες κλήσεις της καθολικής μεθόδου θα επιστραφούν με την ίδια σειρά χωρίς να χρειάζεται να εκτελέσετε γενικά τον συγχρονισμό.
Παρακάτω είναι ο κωδικός για να εκτελέσετε το ίδιο.
// Lazy Load Method δημόσια τάξη LazyLoadSingleton {private LazyLoadSingleton () {} ιδιωτική στατική τάξη SingletonClassHolder {static final Var INSTANCE = new LazyLoadSingleton ()} δημόσια στατική LazyLoadSingleton getInstance () {return SingletonClassHolder.INSTANCE}}
6. Μέθοδος αρχικοποίησης στατικού μπλοκ
Αυτή η μέθοδος δημιουργίας μιας τάξης singleton στην Java είναιπαρόμοια με την πρόθυμη μέθοδο προετοιμασίας. Η μόνη διαφορά είναι ότι η παρουσία για αυτήν την κλάση δημιουργείται εντός του στατικού μπλοκ που έχει λειτουργικότητα.
// Static Block Initialization δημόσια τάξη StaticBlockSingleton {private static StaticBlockSingleton INSTANCE ιδιωτικό StaticBlockSingleton () {} // χειρισμός εξαιρέσεων εντός στατικού μπλοκ στατικού {try {INSTANCE = new StaticBlockSingleton ()} catch (Εξαίρεση e) {ρίξτε νέο RuntimeException ('Πραγματοποιήθηκε εξαίρεση κατά τη δημιουργία μιας Singleton Class ')}} δημόσια στατική StaticBlockSingleton getInstance () {return INSTANCE}}
Αυτό μας φέρνει στο τέλος αυτού του άρθρου σχετικά με την κατηγορία Singleton στην Java. Αν θέλετε να μάθετε περισσότερα για την Java μπορείτε να ανατρέξετε στο .
Τώρα που έχετε καταλάβει τι είναι μια τάξη Singleton στην Java, ρίξτε μια ματιά στο από την Edureka, μια αξιόπιστη διαδικτυακή εταιρεία εκμάθησης με δίκτυο περισσότερων από 250.000 ικανοποιημένων μαθητών σε όλο τον κόσμο. Το μάθημα εκπαίδευσης και πιστοποίησης Java J2EE και SOA της Edureka έχει σχεδιαστεί για μαθητές και επαγγελματίες που θέλουν να γίνουν προγραμματιστές Java. Το μάθημα έχει σχεδιαστεί για να σας δώσει μια πρώτη αρχή στον προγραμματισμό Java και να σας εκπαιδεύσει τόσο για τις βασικές όσο και για τις προηγμένες ιδέες Java μαζί με διάφορα πλαίσια Java όπως το Hibernate & Spring.
Έχετε μια ερώτηση για εμάς; Παρακαλώ αναφέρετέ το στην ενότητα σχολίων αυτού του άρθρου 'Singleton Class in Java' και θα επικοινωνήσουμε μαζί σας το συντομότερο δυνατό.