Как правильно инициализировать переменные объекта в Java?

166
21 января 2018, 04:03

Прошу уточнить какой вариант инициализации является наиболее хорошей практикой. Если ни один из них не является хорошей, то прошу привести свой пример. Конкретно интересует пример инициализации полей объектов из других классов. Спасибо

1-ый вариант:

public class A { String text; int count;} 
public class B { public static void main(String[]args)
     {
       A a= new A();
       a.text="Text";
       a.count=10;  
     }
}

2-ой вариант:

  public class A { 
                   String text; 
                     int count; 
          public A(String text; int count){
          this.text=text;
          this.count=count;
           } 
 }
    public class B { public static void main(String[]args)
         {
           A a= new A("Text",10);
         }
    }

3-ий вариант:

    public class A { String text; int count;
 public void setText (String text){this.text=text};
 public String getText(){return text};
 public void setCount (int count){this.count=count};
 public String getCount(){return count};
    } 
        public class B { public static void main(String[]args)
             {
               A a= new A();
               a.setText("Text");
               a.setCount(10);  
             }
        }
Answer 1

Для большинства случаев самым лучшим вариантом является вариант внедрения зависимостей через конструктор. Финализированные поля дают некоторую защиту при многопоточном исполнении, внедрение зависимостей через конструктор хорошо согласуется с принципом Dependency Inversion (Inversion Of Control) и считается хорошей практикой. Широко используется в популярном фреймворке Spring, не мешает Unit-тестированию и работе с заглушками (Mocking). Подобный код обладает более слабой связанностью по парадигме SOLID. Пример кода ниже:

public class SomeClass {
    private final SomeInterface someImplementation;
    private final OtherInterface otherImplementation;
    @Autowired // or without autowired if you don't use Spring
    public SomeClass(SomeInterface someImplementation, OtherInterface otherImplementation){
        this.someImplementation= someImplementation;
        this.otherImplementation= otherImplementation;
    }
    // class functionality here
}
READ ALSO
Изменение цвета линий в ListView

Изменение цвета линий в ListView

Как изменить только цвет линий(полосок) в ListView?

196
Создание файла Java

Создание файла Java

Здравствуйте, как создать файл на диске С? Когда делаю на D, все работаетКогда изменяю D на С ничего не происходит

211
ArrayDeque хранит только ссылки на объекты?

ArrayDeque хранит только ссылки на объекты?

Я пытаюсь сделать стек из arraylist'ов, но созданный мною хранит только ссылку на объект, который в него добавили, а я хочу, чтобы он хранил сам...

145
Изменение parent activity программно

Изменение parent activity программно

Есть класс MainActivity2 , в манифесте стоит его parent activity , после нажатии на кнопку activity открывается , но parent activity должен поменяться

175