Может понять сеттеры и геттеры в Java - PullRequest
2 голосов
/ 31 декабря 2011

Я новичок в Java, но мне нравится язык, и я хочу стать как можно лучше, но у меня все еще есть некоторые трудности с "классом".Я понимаю, что такое класс и что такое объекты, но все еще не могу понять, что получатели и установщики

Я знаю, что класс имеет

  • Переменные экземпляра
  • Конструкторы
  • Методы
  • Сеттеры и геттеры?

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

Также хотел бы отметить, что я прочитал несколько статей в интернете, но

  1. это были слишком "технические"
  2. , они просто пишут код без переменных экземпляра, конструкторов, чтобы я могне очень хорошо понимаю

Ваша помощь очень ценится, даже если вы начинающий, как я ^^

Редактировать:

Дляпример, как я должен использовать сеттеры и геттеры здесь?

class Demo {

    int a=4;
    Int b;

    public Demo () {
        System.println("a is <than b")
    };

    public int Demo (int b) { 
        if (a<b)
            System.out.println("a is < than b");
        else
            System.out.println("b is < than a");
    } 
}

Ответы [ 5 ]

6 голосов
/ 31 декабря 2011

Вы попросили простой пример, поэтому я приведу один. Предположим, вы разрабатываете класс круга. Круг можно охарактеризовать по диаметру:

public class Circle {
    private double diameter;

    public Circle(double diameter) {
        this.diameter = diameter;
    }
}

Звонящий может захотеть узнать диаметр круга, поэтому вы добавляете геттер:

public class Circle {
    private double diameter;

    public Circle(double diameter) {
        this.diameter = diameter;
    }

    public double getDiameter() {
        return this.diameter;
    }
}

Возможно, вы также захотите получить площадь круга, поэтому вы добавляете геттер для этой области:

public double getArea() {
    return Math.PI * (this.diameter / 2) * (this.diameter / 2);
}

И тогда вы понимаете, что использование радиуса, а не диаметра, проще для внутренних методов круга. Но вы хотите, чтобы все пользователи вашего класса оставались такими, как есть, чтобы не нарушать существующий код. Таким образом, вы изменяете внутреннюю часть класса, не меняя интерфейс:

public class Circle {
    private double radius;

    public Circle(double diameter) {
        this.radius = diameter / 2;
    }

    public double getArea() {
        return Math. PI * radius * radius;
    }

    public double getDiameter() {
        return this.radius * 2;
    }
}

И, наконец, вы хотите изменить диаметр круга, поэтому вы добавляете сеттер:

public void setDiameter(double diameter) {
    this.radius = diameter / 2;
}

Но подождите, круг с отрицательным диаметром не имеет смысла, поэтому вы делаете метод более безопасным:

public void setDiameter(double diameter) {
    if (diameter <= 0) {
        throw new IllegalArgumentException("diameter must be > 0");
    }
    this.radius = diameter / 2;
}

Если бы вы предварительно вычислили площадь во время строительства, setDiameter также должен был бы изменить значение области:

public class Circle {
    private double radius;
    private double area;

    public Circle(double diameter) {
        this.radius = diameter / 2;
        this.area = Math. PI * radius * radius;
    }

    public double getArea() {
        return area;
    }

    public double getDiameter() {
        return this.radius / 2;
    }

    public void setDiameter(double diameter) {
        this.radius = diameter / 2;
        // the area must also be changed, else the invariants are broken.
        this.area = Math. PI * radius * radius;
    }
}

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

6 голосов
/ 31 декабря 2011

Они нужны вам, чтобы пользователи вашего класса могли получать и устанавливать параметры.Это позволяет вашему классу отслеживать, когда установлены параметры и, например, проверять ограничения, обеспечивать согласованность, обновлять другие значения, аннулировать кэши.Инкапсуляция также позволяет вам изменять внутреннее представление класса между версиями, сохраняя API-совместимость.

3 голосов
/ 31 декабря 2011

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

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

Сеттер - это метод public, который устанавливает частное значение. Как вы уже догадались, это позволяет свойству оставаться приватным, но все же быть установленным вне класса.

2 голосов
/ 31 декабря 2011

Сеттеры и геттеры - это просто методы, которые используются для доступа к полям, связанным с классом:

class Demo {

    int a;

    public Demo () { a=4; }

    public int getDemo () { return a; }

    public void setDemo (int a) { this.a=a; }

}
0 голосов
/ 31 декабря 2011

Методы получения и установки - это способ доступа к Java Bean свойствам, связанным с классом. Это просто стандартное средство доступа к публичным полям, которыми заинтересован класс. Они определены в спецификации Java Bean.

...