В методе move() Мы значит меняем дистанцию через setDistance A в методе print() выводим почему то через приватный dinstance Не нарушаем ли мы инкапсуляцию
package com.javarush.task.task21.task2113;
import java.util.ArrayList;
import java.util.List;
///////////////////////////////////////////////////////
public class Hippodrome {
public static Hippodrome game;
private static List<Horse> horses;
public Hippodrome(List<Horse> horses) {
this.horses = horses;
}
public List<Horse> getHorses() {
return horses;
}
public void run () {
int count = 0;
while (count < 100) {
count++;
move();
print();
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void move () {
for (int i = 0; i < horses.size(); i++) {
horses.get(i).move();
}
}
public void print () {
for (int i = 0; i < horses.size(); i++) {
horses.get(i).print(); // вызывает print() из класса Horse
}
for (int y = 0; y < 10; y++) {
System.out.println();
}
}
public static void main(String[] args) {
game = new Hippodrome(new ArrayList<>());
Horse horse1 = new Horse("First", 3, 0);
Horse horse2 = new Horse("Second", 3, 0);
Horse horse3 = new Horse("Three", 3, 0);
horses = new ArrayList<>();
horses.add(horse1);
horses.add(horse2);
horses.add(horse3);
game.run();
}
}
////////////////////////////////////////////
package com.javarush.task.task21.task2113;
public class Horse {
private String name;
private double speed;
private double distance;
public Horse (String name, double speed, double distance) {
this.name = name;
this.speed = speed;
this.distance = distance;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getSpeed() {
return speed;
}
public void setSpeed(double speed) {
this.speed = speed;
}
public double getDistance() {
distance = distance;
return distance;
}
public void setDistance(double distance) {
this.distance = distance;
}
public void move () {
setDistance(speed*Math.random());
}
public void print () {
int t = (int)Math.floor(distance); // почему здесь distance, а не getDistance()
String poin = "";
String name = getName();
for (int y = 0; y < t; y++) {
poin += ".";
}
System.out.println(poin + name);
}
}
Обанин Евгений Геннадьевич
41 уровень
Нужна помощь не можем прояснить про геттеры и сеттеры на конкретном примере Прошу присоединиться к общению
Решен
Комментарии (19)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Justinian Judge в Mega City One Master
6 июня 2020, 09:41полезный
6 разворотов экрана занял твой код у меня на мониторе.
Код программиста это его лицо, показываешь какой-то код, поубирай пустые строки лишние,
Вопрос правда не понял.
Из того что я в этой простынке вижу, у нас есть один класс, с несколькими приватными полями, методами. В одном из метода класса, идет обращению к полю класса. Доступ к которому есть у всех методов класса и так. О какой инкапсуляции речь?
В конструкторе например тоже написано:
this.distance = distance;
это тоже нарушение инкапсуляции?
В методе move написали так, в принципе гораздо более читаемо, почему нет. Использовать один метод через другой.
Ну либо я что-то не понимаю, так растолкуй. +2
Обанин Евгений Геннадьевич
6 июня 2020, 15:40
Поправил код Извини за код через телефон скидывал
Вопрос вот в чем Из класса Hippodrome через метод public void print () мы обращаемся к классу Horse через horses.get(i).print(); В класса Horse метод print() обращается к переменной distance на прямую а не через getDistance Почему????
0
Обанин Евгений Геннадьевич
6 июня 2020, 15:50
Получается я из другого класса обращаюсь к методу и использую переменную приватную А вдруг в методе getDistance какое условие прописано, а в коде получается это условие пропускается
0
Обанин Евгений Геннадьевич
6 июня 2020, 15:51
То есть нарушение инкапсуляции Обращение к переменной на прямую, а не через getter
0
Обанин Евгений Геннадьевич
6 июня 2020, 16:04
А вот метод move() класса Horse изменяет переменную через setter setDistance(speed*Math.random()); Здесь сделано правильно Вот так и надо сделать и в методе print() не int t = (int)Math.floor(distance); а int t = (int)Math.floor(getDistance());
0
Justinian Judge в Mega City One Master
6 июня 2020, 16:05полезный
а что с конструктором делать? Там тоже напрямую
+2
Обанин Евгений Геннадьевич
6 июня 2020, 16:06
Мы же не получаем результат через конструктор
0
Обанин Евгений Геннадьевич
6 июня 2020, 16:06
Для чего нужны getter и сеттер??
0
Обанин Евгений Геннадьевич
6 июня 2020, 16:08
Вы предлагаете не использовать геттеры и сеттеры )))?
0
Justinian Judge в Mega City One Master
6 июня 2020, 16:09полезный
метод print() тоже войдовский и не возвращает результат.
Конструктор использует переменную.
Метод move использует переменную.
Геттеры и сеттеры нужны для регулирования доступа к переменной ВНЕ класса, где хранится переменная.
Ведь доступ к переменной внутри класса естественно есть.
То есть мы делаем их приватными (в идеале финальными), и даем геттеры.
В учебных вариантах можно и не финальные, и делать геттеры, а также сеттеры если это обусловлено бизнес-логикой.
+2
Justinian Judge в Mega City One Master
6 июня 2020, 16:10полезный
посмотри классы стандартной библиотеки джава, вспомни, классы потоков или коллекций. И как там обращаются к внутренним приватным полям в методам - через геттеры или напрямую.
+2
Обанин Евгений Геннадьевич
6 июня 2020, 16:13
Ок посмотрю Мое мнение Если переменные сделали приват То любое обращение к ним должно быть через геттеры и сеттеры Особенно если другие классы обращаются к этим классам
0
Обанин Евгений Геннадьевич
6 июня 2020, 16:20
Тогда почему в классе Horse в методе public void move () {
setDistance(speed*Math.random());
} НЕ НАПРЯМУЮ а через setter
0
Justinian Judge в Mega City One Master
6 июня 2020, 16:26полезный
А если нету геттеров, что тогда?
Переменная приват, а геттеров нет. Как тогда использовать? :)
я бы так написал исключительно для читабельности.
Это как написать distance и this.distance, можно так, можно иначе. Разница только в читабельности.
Сам посуди, в чем разница то? Ты можешь сформулировать в чем разница кроме абстрактных терминов, в которых ты запутался :) А именно показать разницу.
Вот пишем setDistance такие последствия и разница.
Пишем getDistance в move такое происходит, а вот если напрямую то совершенно иное.
Я думаю не можешь.
Пока что очень похоже, что ты вспомнил правило про геттеры и сеттеры только применяешь его не там.
Геттеры и сеттеры это публичное АПИ класса, это о том, как с классом работать в других пакетах, а не том, как работать с переменными внутри класса.
Если массажным маслом полезно растираться, это не значит что его еще и пить нужно :)
В одних случаях мы пишем так, в других иначе.
Может быть только один случаей, когда геттер/сеттер проводит дополнительную логику, но это уже нарушение компетенции методов и такое я не встречал в природе +2
Обанин Евгений Геннадьевич
6 июня 2020, 16:31
Посмотрел класс Thread строка 439 public String toString() {
ThreadGroup group = this.getThreadGroup();
return group != null ? "Thread[" + this.getName() + "," + this.getPriority() + "," + group.getName() + "]" : "Thread[" + this.getName() + "," + this.getPriority() + ",]";
} ГЕТТЕРЫ не НАПРЯМУЮ
0
Обанин Евгений Геннадьевич
6 июня 2020, 16:36
Вот ссылка здесь четко объясняет для чего это надо в самом начале https://www.youtube.com/watch?v=zf3lDojNxlA&list=PLAma_mKffTOSUkXp26rgdnC0PicnmnDak&index=18
0
Обанин Евгений Геннадьевич
6 июня 2020, 16:40
Ладно я понял вашу точку зрения спасибо Надо третьего )))
0
Justinian Judge в Mega City One Master
6 июня 2020, 16:44решение
Вот это ты пример нашел )))))))
Посмотри на поле name, посмотри внимательно на сеттер этого поля, и посмотри на поле distance у Horse и его сеттер и найди 20 отличий :)
Это же базовый класс мультипоточности, он вообще особняком стоит.
Насчет твоего видео, то в нем автор на протяжении всего видео в методе speak обращается к переменным напрямую :) Все как я говорю.
Я же допрашиваюсь не ради спора, я за то, чтобы ты анализировал и думал.
Cat {
private name ;
}
если мы так оставим, мы не сможем в другом пакете узнать в принципе имя у кота. Поэтому нам для этого нужен геттер.
если мы сделаем поле публичным, то мы сможем в классе Dog, получить на вход кота и поменять его имя, "поломать" его.
Вот тебе конкретные примеры.
Пример почему нельзя обращаться к distance напрямую снутри класса ты не можешь сформулировать. И тебя не останавливает даже то , что Алишев в своем коде так делает, обращается к переменным без геттера :D
Я вот за это допрашиваюсь, чтобы ничего не воспринимал "пиши вот так, потому что так" а что, почему, кто его знает.
Ты должен знать ответ на вопрос, что и как нарушится, если делать не так, а иначе.
Но такое, мы друг друга поняли
Кстати про веру, чтобы отвлечься:
http://abhidharma.ru/A/Vedalla/Content/MN-22.htm
Очень люблю эту притчу.
+2
Обанин Евгений Геннадьевич
6 июня 2020, 16:56
Спасибо Постараюсь разобраться
0