2015-05-13 4 views
5

У меня есть Point. Я пытаюсь получить x как int. Если я использую Point.x, я получу x как int. Но у меня создается впечатление, что я должен использовать геттер, когда это возможно (Why use getters and setters?). Проблема с Point.getX() заключается в том, что она возвращает double вместо int.Должен ли я использовать Point.x или Point.getX()?

Что лучше, или это просто предпочтение?

a или b?

Point point = new Point(5, 5); 
int a = point.x; 
int b = (int) point.getX(); 

Я прочитал Java Point, difference between getX() and point.x, но это не реально ответить на мой вопрос. Или, по крайней мере, я не понял ответа.

+2

Я использую 'point.x'. Это не * ваша * ошибка, что «Point» сломан. :-) Это не похоже на то, что ваш код будет развиваться для работы с суб-супер-типом Point. – aioobe

ответ

2

getX() и getY() функции класса Point возвращают двойной, потому что это то, что требует его родительский класс (Point2D). Это значит, что все его подклассы (Point2D.Double и Point2D.Float) будут работать в одних и тех же местах.

Использование point.x и point.y непосредственно вместо того, чтобы использовать функции геттера, вероятно, хорошо в этом случае, так как класс точки является странным углом так, что никто, кажется, любовь- большинства людей думают, что должно быть неизменным, или по крайней мере лучше скрыть его значения.

Если вы боитесь чего-то вроде обзора кода, просто добавьте комментарий, объясняющий, почему вы напрямую обращаетесь к переменным x и y.

tl; dr: это просто сводится к личным предпочтениям.

1

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

1

В качестве double тип возвращаемого метода получения метода точечного класса должен сделать его совместимым только через наследование, а getX() ничего не делать, не возвращая значения.

ТАК, Его как раз о ваших предпочтениях, я думаю.
Но как использовать point.x (зачем делать ненужное преобразование?) Только в этом случае, хотя я предпочитаю использовать геттер/сеттер всегда.

0

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

Из документации Point:

Точки, представляющая местоположение в (х, у) координатного пространства, указанная в целочисленной точности.

С: 1.0

Из документации Point2D:

Класс Point2D определяет точку, представляющий местоположение в (х, у) координатное пространство.

С: 1,2

Проще говоря: Point класс существовал с начала времен, и Point2D класс был введен позже. Класс Point был обновлен, также как Point2D, и предлагает вам getX() методах.


Когда вы работаете с Point и самоотверженно только с Point, и вы всегда и только хотят иметь дело с int координат, то вы можете использовать point.x для доступа к полю непосредственно.

В противном случае, когда двойные координаты имеют смысл для вашего случая приложения, и вы хотите, например, метод, который получает «точку» в качестве параметра, вам обычно следует рассмотреть класс абстрактных Point2D, потому что тогда вы можете пройти a Point, a Point2D.Double или экземпляр Point2D.Float к этому методу.

Смежные вопросы