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)
}