Sobes.tech
Junior

Koja je razlika između injekcije zavisnosti putem konstruktora i putem settera?

sobes.tech АИ

Одговор од АИ

Razlika u vremenu implementacije, obaveznosi zavisnosti i mogućnostima pri kreiranju objekta:

Osobina Implementacija putem konstruktora Implementacija putem setera
Vreme implementacije Pri kreiranju objekta. Nakon kreiranja objekta.
Obaveznosť Zavisnost je obavezna za kreiranje objekta. Zavisnost je opcionalna.
Stanje objekta Objekat se kreira potpuno inicijalizovan. Objekat može biti kreiran u nekom nekompletno inicijalizovanom stanju.
Nemogućnost promene Omogućava kreiranje objekta sa nemogućim zavisnostima. Zavisnosti mogu biti promenjene nakon kreiranja objekta.
Broj zavisnosti Bolje za mali broj zavisnosti. Pogodnije za veliki broj opcionalnih zavisnosti.
Ciklične zavisnosti Signal za problematičnu cikličnu zavisnost. Može skrivati ciklične zavisnosti.

Implementacija putem konstruktora je preferirana za obavezne zavisnosti, obezbeđuje celokupnost objekta od trenutka njegovog kreiranja i omogućava postizanje nemogućnosti promene.

// Primer implementacije putem konstruktora
public class ServiceA {
    private final DependencyB dependencyB;

    public ServiceA(DependencyB dependencyB) {
        this.dependencyB = dependencyB;
    }

    // ... metode koje koriste dependencyB
}

Implementacija putem setera je pogodna za opcionalne zavisnosti ili kada je potrebna fleksibilnost u promeni zavisnosti nakon kreiranja objekta.

// Primer implementacije putem setera
public class ServiceC {
    private DependencyD dependencyD;

    public void setDependencyD(DependencyD dependencyD) {
        this.dependencyD = dependencyD;
    }

    // ... metode koje koriste dependencyD (sa proverom na null, ako je zavisnost opcionalna)
}