2016-01-19 3 views
1

Является ли приведенный ниже пример инъекции зависимостей.Инъекционная инъекция java

public class Employee { 
    private String name; 
    private String company; 

    public Employee(String name, String company){ 
     this.name = name; 
     this.company = company; 
    } 

    public String getName(){ 
     return name; 
    } 
    public void setName(String name){ 
     this.name = name; 
    } 
    public String getCompany(){ 
     return company; 
    } 
    public void setCompany(String company){ 
     this.company = company; 
    } 
} 

Application класс имеет зависимость от Employee

public class Application { 

    private static Employee emp; 
    private static String name; 
    private static String company; 

    public Application(Employee emp){ 
     this.emp = emp; 
    } 

    public static String getApplication(){ 
     name = emp.getName(); 
     company = emp.getCompany(); 
     return "Name: " + name + "\nCompany: " + company; 
    } 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     Employee emp1 = new Employee("John", "ABC"); 
     Application app1 = new Application(emp1); 
     System.out.println(app1.getApplication()); 
    } 

} 
+2

'частных эй статического Employee;' ... ** статический ** .... нет, это не так. – EpicPandaForce

+0

Вам не нужно 'static', кроме вашего' main' метода. –

ответ

3

инжектирует зависимость здесь:

Employee emp1 = new Employee("John", "ABC"); 
Application app1 = new Application(emp1); 

до такой степени, как экземпляр Application требуется экземпляр Employee, и, следовательно, рекламирует на его конструкторе, который должен быть поставлен. Это пример учебника по инвертированию этой зависимости. (Или, упрощен, «Требовать, не экземпляр.»)

Однако, как вы магазин что зависимость немного сомнительна:

private static Employee emp; 

В примере условии, что это, вероятно, не будет вызывать какие-то проблемы. Но что происходит, когда вам нужно создать еще один экземпляр Application, которому нужен другой экземпляр зависимостей Employee? Этот второй экземпляр будет переписывать первый и нарушать его зависимость.

Если экземпляр нужна зависимость, то экземпляр должен хранить зависимость:

private Employee emp; 

(может даже сделать его final, а также, если у вас нет причин, чтобы когда-либо изменить его в течение жизни экземпляра.)


Конечно, семантика имени Applicationподразумевает, что будет только один случай. Но одноэлементный экземпляр, вероятно, будет лучшим подходом, чем static членов в этом случае. Как общее правило в объектно-ориентированном программировании, будьте несколько разумными в отношении использования вами членов static. Они имеют их использование, но они очень легко имеют их неправильное использование также.

1

Это пример DI. Вы делаете это здесь:

Employee emp1 = new Employee("John", "ABC"); 
Application app1 = new Application(emp1); 

Вы реализуете его здесь:

public Application(Employee emp){ 
    this.emp = emp; 
} 

Этот вид DI известен как инъекции конструктора.

Если бы у вас была сеттер работника в своем классе приложения, и если бы вы установить сотрудника с этим сеттера, то это назвали бы сеттер инъекции

0

Прежде всего, вы можете прочитать о когда использовать инъекцию зависимостей. Внедрение экземпляра простого класса без функции не имеет для меня никакого смысла.

Обычно вы используете интерфейс для класса, который также имеет поведение, и это больше, чем оболочка данных.Удалите статику и, возможно, добавьте финал, и в вашей инъекции отправьте экземпляр реализации для этого интерфейса.

Как это:

public class TextEditor { 
    /*Interface SpellChecker**/ 
    private final SpellChecker spellChecker; 
    private String text; 

    /**An implementation for the SpellChecker is provided*/ 
    public TextEditor(final SpellChecker spellChecker) { 
     this.spellChecker = spellChecker; 
    } 

    public Boolean spellCheck(){ 
     return this.spellChecker.isSpellingCorrectForText(this.text); 
    } 
} 

Как вы можете видеть в приведенном выше примере ответственности орфографии делегированы внешней зависимости, которая впрыскивается в конструкторе. TextEditor не должен знать, как проверять орфографию, он просто вызывает интерфейс с помощью метода.

Почему мы это делаем? Уважать SOLID (SRP): https://en.wikipedia.org/wiki/SOLID_(object-oriented_design)

Подробнее здесь: https://softwareengineering.stackexchange.com/questions/135971/when-is-it-not-appropriate-to-use-the-dependency-injection-pattern http://www.tutorialspoint.com/spring/spring_dependency_injection.htm

Смежные вопросы