Java

Зачем создают приватные переменные, а затем делают их общедоступными через публичные методы?

Вот пример кода того, что я имею ввиду:
class Car
{
private String maker ;
private String color ;
private String bodyType ;

public Car()
{
maker = "Porsche" ;
color = "Silver" ;
bodyType = "Coupe" ;
}

private String accelerate()
{
String motion = "Accelerating..." ;
return motion ;
}

public void setCar(String brand, String paint, String style)
{
maker = brand ;
color = paint ;
bodyType = style ;
}

public void getCar()
{
System.out.println(maker + " color " + color);
System.out.println(maker + " frame type " + bodyType );
System.out.println(maker + " " + accelerate() + "\n" );
}
}

Зачем объявлять приватные переменные, а затем в методе setCar приравнивать их к публичным? Они же становятся доступными, т. е. теряется тсмысл приватности..
Зачем их вообще было тогда объявлять? Пользовались бы сразу теми, что объявлены в setCar..
Во-первых, у тебя тут нет никакого "приравнивания к публичным" хотя бы потому, что getCar не возвращает в программу никаких значений. Другие классы не могут получить значения переменных.
Но даже если бы и могли, то все равно сохраняется инкапсуляция. Допустим, тебе на каком-то этапе понадобилось при каждом изменении цвета уведомлять полицию:
public void setCar(String brand, String paint, String style)
{
maker = brand ;
if(color!=paint){
color = paint ;
police.InformChange(this, color);
}
bodyType = style ;
}
Если бы color был публичным свойством, то тебе пришлось бы искать все случаи, где он изменяется, и вписывать туда уведомление полиции. А так - всегда изменения идут через этот метод, и любое исправление сразу применяется ко всей программе.
Александр Сарказмов
Александр Сарказмов
96 834
Лучший ответ
Cултан Берекелов Ок.
Спасиб.
Подскажи, ещё плиз, что вот это за звери в скобках метода type(аналогичный пример):

String color, size, erasier;

public void type(String color1, String size1, String erasier1)
{
color = color1;
size = size1;
erasier = erasier1;
}

Это ведь то же переменные? Почему если их не вводить и сделать просто вот так программа выдаёт нули:

String color, size, erasier;

public void type(String color, String size, String erasier)
{

}
понимаешь... если там тупо деревянные гет/сет напишешь, то понятно что толку мало. просто сделаешь как принято.

как тебе уже указали, можешь сделать только гет чтобы изменять не могли

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

почитал код твой внимательнее.... да уж...
Так можно проконтролировать изменение переменных. Например, ограничить возможные значения. Простой пример:
void setNumber(int num) {
____if (num > 0) {
________this.num = num;
____} else {
________System.out.println("Число меньше нуля");
____}
}
Или же случай человека выше.
Дмитрий ))))
Дмитрий ))))
2 387