no dobra ale czym się to różni ? i po co mi to jest w konstruktorze w ogóle jak mam pole ?
W konstruktorze jest Ci to po to, żeby zależność przypisać podczas tworzenia obiektu. Samo Dependency Injection przyda Ci się np. w sytuacji, gdy potrzebujesz zmienić implementację swojej zależności.
Co do samych zalet (i wad) DI - znajdziesz je choćby w artykule do Wikipedii, który wcześniej podlinkowałem.
Oczywiście, że masz pole i obiekt przypisany do tego pola jest Twoją zależnością. Ale jakoś musisz to pole przypisać, żeby mieć referencję do instancji tej zależności. Gdybyś przypisywał to pole w konstruktorze, wówczas użycie Twojego obiektu z tym polem wymuszałoby na Tobie przekazanie od razu tej zależności i nie miałbyś problemu, że gdzieś w kodzie tworzysz sobie obiekt typu Twojej zależności, ale zapomniałeś go przypisać do tego pola.
Dokładnie to zrobiłeś w swoim kodzie z 1. postu.
Chodzi o takie wymuszenie:
// Repozytorium, jak wcześniej
public class EmployeeRepository {
private final EntityManager entityManager;
public EmployeeRepository(EntityManager entityManager) {
this.entityManager = entityManager;
}
public void addEmployee(Employee employee) {
// tutaj dodanie employee do bazy poprzez wykorzystanie wstrzykniętego wcześniej EntityManagera
}
}
// i przykład użycia
public class Main {
public static void main(String... args) {
final EntityManager entityManager = Main.createEntityManager();
final EmployeeRepository employeeRepostiory = new EmployeeRepository(entityManager); // tu jest to wymuszenie - bez przekazania EntityManager
// do konstruktora nie możesz utworzyć obiektu EmployeeRepository
// dzięki temu, nigdy nie utworzysz EmployeeRepository, które nie będzie miało przypisanego pola "entityManager"
// i tu odrobinę zmodyfikowany Twój dotychczasowy kod
// utworzenie obiektów Employee do zapisania
final List<Employee> employees = createEmployees();
// i dla każdego z utworzonych Employee wołamy employeeRepository.addEmployee()
// 1. z życiem metody Collection#forEach i method reference
employees.forEach(employeeRepository::addEmployee);
// 2. klasycznie, z for-each
for(Employee employee : employees) {
employeeRepository.addEmployee(employee);
}
}
private static EntityManager createEntityManager() {
EntityManagerFactory entityManagerFactory =Persistence.createEntityManagerFactory("myDataBase") ;
return entityManagerFactory.createEntityManager();
}
private static List<Employee> createEmployees() {
return List.of(
createEmployee("Maciek", "ss", 2000),
createEmployee("Maciek", "ss", 2000),
createEmployee("Maciek", "ss", 2000),
createEmployee("Maciek", "ss", 2000),
createEmployee("Maciek", "ss", 2000),
createEmployee("Maciek", "ss", 2000),
createEmployee("Maciek", "ss", 2000),
createEmployee("Maciek", "ss", 2000),
createEmployee("Maciek", "ss", 2000),
createEmployee("Maciek", "ss", 2000),
createEmployee("Maciek", "ss", 2000)
);
}
private static Employee createEmployee(String firstName, String lastName, long salary) {
Employee employee=new Employee();
employee.setFirstName(firstName);
employee.setLastName(lastName);
employee.setSalary(salary);
return employee;
}
}
Powyższe rozwiązanie mogłoby być jeszcze ładniejsze stosując choćby Single Responsibility itd., ale nie o tym teraz rozmawiamy, więc starałem się zachować zgodność z Twoim dotychczasowym kodem.
Rozumiem że ta metoda jest przeciążona ?
Nic tu nie jest przeciążone. To jest po prostu przykład metody, która mogłaby zapisywać Employee
.