Getter-Setter и частные переменные

Если я могу изменить значение частной переменной через ссылку getter-return, то разве это не обход метода setter? Разве это не побеждает цель getter-setter и частных переменных

public class Test{

private Dimension cannotBeChanged;

public Test(int height, int width)
{
    if(height!=3)
       cannotBeChanged.height = height;
    if(width!=3)
       cannotBeChanged.width  = width;
}

public Dimension getDimension()
{
    return cannotBeChanged;
}


public void setDimension(int height, int width)
{
    if(height!=3)
       cannotBeChanged.height = height;
    if(width!=3)
       cannotBeChanged.width  = width;    
} 

 public static void main(String [] args)
{
    Test testOne = new Test(5,5);
    Dimension testSecond = testOne.getDimension();
    testSecond.height = 3; //Changed height and width to unwanted values
    testSecond.width= 3;
}

Ответ 1

Да, это так. У меня есть следующий вывод в геттерах и сеттерах из книги "Чистый код"; вы можете использовать его, если действительно принимаете его.

  • Очень зло: публичные поля.
  • Несколько зла: Getters и сеттеры, где они не требуются.
  • Хорошо: Getters и сеттеры только там, где они действительно требуются. тип подвергается "большему" поведению, которое используется для использования его состояния, а не просто рассматривать тип как хранилище состояния, которое должно быть управляемые другими типами.

Ответ 2

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

  • Никогда не создавайте сеттер для защищенного свойства вашего объекта. Может быть предоставлен только получатель.
  • Создавать сеттеры только для тех свойств, которые могут меняться в ходе программы.
  • Использовать сеттеры, если вы хотите применить определенные ограничения для некоторых свойств, например. применять недействительные проверки значений, предпопуляции, логический анализ, заполнение другого зависимого свойства, защитное копирование и т.д.
  • Getters/seters помогает поддерживать программную энтропию системы. Читайте о программном обеспечении entropy.
  • Не создавайте геттеры/сеттеры там, где это не требуется, поскольку приводит к Boilerplate код.
  • Getters/setters помогает в изменении базовой реализации для будущих расширений программ, например. Обновление журналов журналов и т.д.

Ответ 3

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

public int getDimensionX()
{
    return cannotBeChanged.getX();
}

public int getDimensionY()
{
    return cannotBeChanged.getY();
}

Ответ 4

Вот простейшая тестовая версия от меня. Как вы можете видеть, вы можете изменить высоту измерения Dimension, потому что это ссылка, но вы не можете установить новое измерение.

import java.awt.Dimension;


public class TestProperty
{
    private String testy;
    private Dimension testDim = new Dimension(2,2);

    TestProperty(String testy)
    {
        this.testy = testy;
    }

    public String getTesty()
    {
        return testy;
    }

    public void setTesty(String testy)
    {
        this.testy = testy;
    }

    public Dimension getTestDim()
    {
        return testDim;
    }

    public void setTestDim(Dimension testDim)
    {
        this.testDim = testDim;
    }
}

Мой основной() - метод:

import java.awt.Dimension;

public class Test
{

    public static void main(String[] ARGS)
    {
        TestProperty testy = new TestProperty("Testy");

        String myString = testy.getTesty();
        Dimension myDimension = testy.getTestDim();
        myDimension.height = 5; //Changes the height of the private Dimension
        myDimension = new Dimension(5,3); //Does not set a new Instance of Dimension to my TestProperty.

        myString = "Test";
        System.out.println(myString+"|"+testy.getTesty());
        System.out.println(myDimension.height+"|"+testy.getTestDim().height);
    }
}

Вывод:

Test|Testy
3|5

Ответ 5

Частные переменные предназначены для доступа только из класса, который был объявлен. Когда вы создаете метод getter, который возвращает значение частной переменной, вы не получаете адрес, а вместо этого создаете временную копию, содержащую значение возвращаемого значения. Метод setter устанавливает значение для частной переменной, которая не может быть выполнена, когда она из другого класса.

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

Примечание. Значения ширины и высоты, которые вы изменяете, являются переменными из класса Dimension, поэтому они не являются частными.

Взгляните на этот пример:

public class Test {

private double width, height;

public Test(int height, int width)
{
    setDimension(height, width);
}

public double getWidth() { return width; }
public double getHeight() { return height; }


public void setDimension(int height, int width)
{
    if(height!=3)
       this.height = height;
    if(width!=3)
       this.width  = width;
}

public static void main(String [] args)
{
    Test test = new Test(5,5);
    double testW = test.getWidth();

    testW = 3;

    System.out.println(testW);
    System.out.println(test.getWidth());
}
}

Возврат:

3.0
5.0