Sobes.tech
Junior

Kādus atkarības injekcijas veidus jūs zināt?

sobes.tech AI

Atbilde no AI

Ir trīs galvenie atkarības veidi:

  1. Caur konstruktoru (Constructor Injection): Atkarības tiek nodrošinātas klasei caur tās konstruktoru. Klase nevar tikt izveidota bez visām nepieciešamajām atkarībām. Tas nodrošina skaidru atkarību specifikāciju un atvieglo testēšanu:

    public class SomeService {
    
        private final Dependency dependency;
    
        public SomeService(Dependency dependency) { // Caur konstruktoru ievadīšana
            this.dependency = dependency;
        }
    
        public void doSomething() {
            dependency.execute();
        }
    }
    
  2. Caur iestatītāju (Setter Injection): Atkarības tiek nodrošinātas klasei caur publiskiem iestatītāju metodēm. Tas padara klasi elastīgāku konfigurācijā, bet ne garantē visu atkarību nodrošināšanu objekta izveides laikā:

    public class AnotherService {
    
        private Dependency dependency;
    
        public void setDependency(Dependency dependency) { // Caur iestatītāju ievadīšana
            this.dependency = dependency;
        }
    
        public void doSomethingElse() {
            if (dependency != null) {
                dependency.execute();
            } else {
                // Apstrādāt atkarības neesamības gadījumu
            }
        }
    }
    
  3. Caur interfeisu (Interface Injection): Mazāk izplatīts veids, kad atkarīgā klase ir jāievieš noteiktu interfeisu, kas nodrošina iestatītāju atkarībai. Injektors izmanto šo interfeisu, lai nodrošinātu atkarību:

    // Interfeiss, kas definē metodi atkarības ieviešanai
    public interface DependencyInjectable {
        void setDependency(Dependency dependency);
    }
    
    public class YetAnotherService implements DependencyInjectable {
    
        private Dependency dependency;
    
        @Override
        public void setDependency(Dependency dependency) { // Interfeisa metodes realizācija
            this.dependency = dependency;
        }
    
        public void performAction() {
            if (dependency != null) {
                dependency.execute();
            }
        }
    }
    

Salīdzinājums:

Metode Priekšrocības Trūkumi Tipiskas lietošanas situācijas
Caur konstruktoru Skaidra specifikācija, nemainīgums Daudzas atkarības var novest pie "plašāka" konstruktora Obligātas atkarības, nemaināmu objektu izveide
Caur iestatītāju Opcijas atkarības, elastīga konfigurācija Ne garantē atkarības esamību, mainīga stāvokļa Opcijas atkarības, mantošana, konfigurācija pēc izveides
Caur interfeisu Mazāk izplatīts Papildu sarežģītība Retos scenārijos, kad nepieciešama standartizēta ieviešanas metode

Vislabākā pieeja lielākajā daļā gadījumu ir ieviešana caur konstruktoru, īpaši obligātām atkarībām, jo tas skaidri definē klases līgumu un veicina pareizas stāvokļa objektu izveidi. Ieviešana caur iestatītāju ir ērta opcijālām atkarībām vai daudzām atkarībām, lai izvairītos no garām konstruktoru ķēdēm. Ieviešana caur interfeisu ir retāk sastopama un var būt noderīga specifiskās ietvaros vai standartizācijas vajadzībām.