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