Sobes.tech
Junior

Ποιοι τύποι εξαρτημένης εισαγωγής γνωρίζετε;

sobes.tech AI

Απάντηση από AI

Υπάρχουν τρεις βασικοί τύποι:

  1. Ενέσεις πεδίου (Field Injection): Η εξάρτηση ενέχεται απευθείας στο πεδίο της κλάσης μέσω μιας σημείωσης (π.χ., @Autowired στο Spring). Είναι εύκολη στη χρήση, αλλά δυσκολεύει τις μονάδες δοκιμών και παραβιάζει την αρχή της ενιαίας ευθύνης, κρύβοντας τις εξαρτήσεις.

    // Παράδειγμα ενέσεων πεδίου
    public class MyService {
        // Η εξάρτηση ενέχεται απευθείας στο πεδίο
        @Autowired
        private MyRepository repository;
    
        public void doSomething() {
            repository.getData();
        }
    }
    
  2. Ενέσεις μέσω setter (Setter Injection): Η εξάρτηση ενέχεται μέσω μιας δημόσιας μεθόδου setter. Επιτρέπει την προαιρετική ύπαρξη εξάρτησης (μη υποχρεωτική), βολική για την αλλαγή των εξαρτήσεων κατά την εκτέλεση (αν και σπάνια χρησιμοποιείται). Δεν δημιουργεί υποχρεωτική εξάρτηση κατά τη δημιουργία του αντικειμένου.

    // Παράδειγμα ενέσεων μέσω setter
    public class MyService {
        private MyRepository repository;
    
        // Η εξάρτηση ενέχεται μέσω setter
        @Autowired
        public void setRepository(MyRepository repository) {
            this.repository = repository;
        }
    
        public void doSomething() {
            repository.getData();
        }
    }
    
  3. Ενέσεις μέσω constructor (Constructor Injection): Η εξάρτηση ενέχεται μέσω του ορίσματος του κατασκευαστή. Προτιμάται, καθώς διασφαλίζει ότι η εξάρτηση είναι υποχρεωτική (χωρίς αυτή, το αντικείμενο δεν μπορεί να δημιουργηθεί), διευκολύνει τις μονάδες δοκιμών (εύκολη μεταβίβαση mock αντικειμένων) και δηλώνει σαφώς τις ανάγκες της κλάσης. Κάνει τα αντικείμενα αμετάβλητα μετά τη δημιουργία, αν τα πεδία είναι τελικά.

    // Παράδειγμα ενέσεων μέσω constructor
    public class MyService {
        private final MyRepository repository; // Το πεδίο μπορεί να είναι τελικό
    
        // Η εξάρτηση ενέχεται μέσω του constructor
        @Autowired // Στις νεότερες εκδόσεις του Spring, μπορεί να παραλειφθεί αν υπάρχει μόνο ένας constructor
        public MyService(MyRepository repository) {
            this.repository = repository;
        }
    
        public void doSomething() {
            repository.getData();
        }
    }
    

Πίνακας σύγκρισης:

Τύπος ενέσεων Υποχρεωτικότητα εξάρτησης Ευκολία χρήσης Δοκιμασία Αμεταβλητότητα
Μέσω πεδίου Προαιρετικό (κρυφό) Υψηλή Χαμηλή Όχι
Μέσω setter Προαιρετικό Μέτρια Μέτρια Όχι
Μέσω constructor Υποχρεωτικό Μέτρια Υψηλή Δυνατό

Στις περισσότερες περιπτώσεις, συνιστάται η χρήση ενέσεων μέσω constructor.