Java - к частным переменным экземпляра нужно получить доступ в конструкторах через метод методов считывания и методов set?

Я знаю, что к частным переменным экземпляра получают доступ через их общедоступный метод методов считывания и методов set.

Но когда я генерирую конструкторов с помощью IDE, он инициализирует переменные экземпляра непосредственно вместо того, чтобы инициализировать их через их методы установщика.

Q1. Так должен я изменяться, IDE сгенерировал код для конструкторов для инициализации тех переменных экземпляра через их методы установщика.

Q2. Если да, то, почему IDE не генерирует код конструкторов таким образом?

============================= ОТРЕДАКТИРОВАННЫЙ =======================================

  • Я использую Eclipse и IDE Netbeans

  • Это - общий вопрос. Но, как спрошено @Lords был бы ответ зависеть от того, общедоступен ли наш конструктор или защищен или пакет, частный или частный?

10
задан Yatendra Goel 2 April 2010 в 19:08
поделиться

7 ответов

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

Рассмотрим этот надуманный пример:

class A {
    private int x;

    public A() {
        setX(2);
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getX() {
        return x;
    }
}

class B extends A {
    private int number = 10;

    @Override        
    public void setX(int x) {
        // set x to the value of number: 10
        super.setX(number);
    }
}

public class Test {
    public static void main(String[] args) {
        B b = new B();
        // b.getX() should be 10, right?
        System.out.println("B.getX() = " + b.getX());
    }
}

Результатом этой программы является:

B.getX() = 0

Причина в том, что член номер B не инициализирован в момент ] setX вызывается, поэтому используется его значение по умолчанию 0 .

Эта статья содержит более подробное объяснение, как и Эффективная Java .

12
ответ дан 3 December 2019 в 22:36
поделиться

Хорошие ответы. Только хочу добавить, что Eclipse (тот, который я часто использую) имеет шаблоны, которые вы можете изменить, чтобы сгенерировать свой код так, как вы хотите. Это может помочь настроить код в соответствии с вашими потребностями.

PS. Я предпочитаю использовать сеттеры и геттеры. Так же, как привычка, сохраняет код согласованным, я чувствую, что кому-то будет легче читать, если я сохраню привычки во всем коде.

0
ответ дан 3 December 2019 в 22:36
поделиться

Прежде всего инициализация! = Сеттеры (по крайней мере, не всегда)

Но IDE просто отлично сочетаются с некогда уважаемым JavaBean шаблон проектирования Предполагается, что изменения свойств должны происходить через сеттеры.

Итак, это вопрос дизайна. Если ваши классы представляют объекты с чистыми значениями, ничего страшного в инициализации через = Но если у ваших классов есть потенциал стать JavaBean , изменение свойств которого больше, чем просто инициализация или присвоение, используйте вызовы set * .

0
ответ дан 3 December 2019 в 22:36
поделиться

Это зависит от обстоятельств. Если ваши сеттеры / геттеры просто обращаются к членам, вы должны обращаться к ним напрямую. Если у вас также есть код, используйте сеттеры.

1
ответ дан 3 December 2019 в 22:36
поделиться

Вы должны решить, какие поля инициализировать с помощью конструктора, а какие - с помощью установщика. (оба варианта возможны) Я предпочитаю использовать конструктор только по мере возможности и часто не имею никаких сеттеров.

Это должно быть настраиваемым / выбираемым в IDE. Не зная свою IDE, невозможно узнать, почему она работает именно так.

0
ответ дан 3 December 2019 в 22:36
поделиться

Конструкторы предназначены для инициализации. Инициализируйте переменные частного экземпляра прямо в конструкторе. Методы определяют поведение объекта. Поведение происходит после создания / инициализации. Управляйте состоянием переменных вашего экземпляра с помощью методов установки. Это классическое мышление ООП и, вероятно, почему ваша IDE генерирует код, который она делает.

2
ответ дан 3 December 2019 в 22:36
поделиться

Переменные частного экземпляра класса должны (я считаю, должны быть) объявлены вне любого конструктора класса. Если бы я мог разделить часть вашего вопроса на две части:

Q1) Если переменные экземпляра инициализируются при создании экземпляра класса, в отличие от локальных переменных, зачем выполнять дополнительную работу в данном конструкторе класса (?).

A1) Хотя вам не нужно инициализировать переменные экземпляра (частная строка someString; по умолчанию используется значение null и допустимо), одна из причин для этого заключается в том, что значение по умолчанию, присвоенное компилятором, может быть не тем значением, которое вы хотите, или хуже , некорректно (что компилятор должен уловить).

Q2) Предполагая, что часть выше, каково значение get; набор; properties?

A2) Помимо того, что они проще и элегантнее, чем эквивалент метода, свойства могут использоваться в любое время в вашем классе (очевидно), они могут использоваться как простые присваивания или содержать дополнительный код (кто-то уже сказал это для проверки информации), и, наконец, данные являются самодостаточными внутри класса и, следовательно, их легче отлаживать.

С учетом всего сказанного, у вас может быть вполне веская причина делать что-то не так, как написано в книге или кем-то еще. Всегда есть свое согласие на «правила», и вы должны кодировать соответственно.

0
ответ дан 3 December 2019 в 22:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: