Можно ли получить значение переменной напрямую вместо использования геттера в Java?

Я пишу программу, которая работает с системой координат, поэтому мне нужно использовать координаты довольно часто. Я решил использовать класс Point, поскольку он очевидно позволяет легко хранить координаты точки.

Проблема повсюду в моей программе. Я сохраняю ее как int, тогда как Point возвращает значение double при использовании методов getX() и getY(). Конечно, я могу легко привести его к int, но это выглядит не очень элегантно и вносит ненужную путаницу в код.

Ничего, если я просто получу значение напрямую? Так:

Point p = new Point(0, 0);
int x = p.x;

вместо:

int x = p.getX();

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


person sajran    schedule 27.05.2017    source источник
comment
stackoverflow .com/questions/11071407/   -  person Mohamed Anees A    schedule 27.05.2017
comment
@MohamedAneesA Я видел эту ветку, но она о ситуации, когда я создаю свой собственный класс. В моем случае класс уже существует и не является моим. Я просто хочу знать, является ли плохой практикой получение значения напрямую.   -  person sajran    schedule 27.05.2017
comment
Я бы предположил, что если вы хотите получить доступ к данным таким образом, вам будет лучше создать свой собственный класс, который содержит Point и предоставляет средства доступа, делегирующие Point. Таким образом, вы Decorate создаете класс и используете композицию. Если вы затем решите хранить данные непосредственно как int в будущем, вы будете защищены. Изменить: у davidxxx есть пример прямого использования вашего собственного.   -  person KevinO    schedule 27.05.2017


Ответы (4)


Я пишу программу, которая работает с системой координат, поэтому мне нужно использовать координаты довольно часто. Я решил использовать класс Point, потому что он, очевидно, позволяет легко хранить координаты точки.

а также

Проблема везде в моей программе, я храню ее как int, тогда как Point возвращает double при использовании методов getX() и getY().

Вы уверены, что это явно позволяет легко хранить координаты точки для вашего домена?
Не думаю.
Использование классов java.awt.Point имеет смысл, если вам нужно манипулировать некоторыми экземплярами java.awt.Point.

Этот класс не подходит для ваших нужд.

  • Если вам действительно не нужно использовать java.awt.Point :

Вы должны создать и использовать свой собственный класс Point, который возвращает значение int, когда вы пишете:

int x = p.getX();
  • Если вы передумали и вам нужно использовать java.awt.Point для некоторых задач:

В пользовательском классе Point добавьте метод для возврата экземпляра java.awt.Point.

person davidxxx    schedule 27.05.2017
comment
Отличный ответ, спасибо! Я действительно не знаю почему, но я подумал, что гораздо лучше использовать существующий класс, чем создавать очень похожий. - person sajran; 27.05.2017
comment
Пожалуйста :) Интересный вопрос. Вы правы: гораздо лучше использовать существующий класс, чем создавать очень похожий... но только если он соответствует вашим потребностям. Этот класс довольно старый и не очень простой в использовании. Он наследуется от Point2D, управляющего double. На самом деле это не проблема, если Point имеет также определенные методы: getIntX() и getIntY(). Но у него их нет. Таким образом, использование Point имеет смысл только тогда, когда вы вынуждены или вы можете воспользоваться этим (например, чтобы отправить объект Point в существующий или сторонний класс, который выполнить задание за вас). - person davidxxx; 27.05.2017

@Sarjan Да ... некоторые могут утверждать, что сеттеры и геттеры - зло. Но я думаю, что это отлично помогает в различных ситуациях, особенно в крупных проектах. Типовой пример — валидация. Скажем, если вы хотите установить x только в том случае, если оно больше 0, вы не можете выполнить это элегантно, если оно общедоступно (если только у вас нет проверки перед установкой переменной..везде!!!...Утомительно, верно?? И отсутствует когда-нибудь это приведет к сбою вашей системы, если какой-то новый программист будет работать над вашим проектом и не знает об этом).

PS: я не мог прокомментировать это, так как оно слишком длинное и, следовательно, написано как ответ.

person Mohamed Anees A    schedule 27.05.2017

Вы связали документацию о Point. Поэтому внимательно читайте и думайте о своей проблеме, а не приступайте к кодированию и размышлениям Сначала придумайте идею. Затем узнайте, что класс java.awt.point лучше всего подходит для вашей ситуации или нет.

Если это не подходит для вашей ситуации, вы можете реализовать класс. В противном случае следуйте документации. Рекомендуется следовать документации, а также концепции ООП.

Point p = new Point(0, 0);

Если вы следовали документации, вы увидите следующее:

Point(): Создает и инициализирует точку в начале (0, 0) координатного пространства.

Я думаю, что вы не имеете четкого представления об этом. Однако,

Point p = new Point();
int x = p.x;

Это не проблема, потому что x это public и это ваша программа. Но почему они реализовали это:

getX();

Также прочитайте эти геттеры и сеттеры, реализация класса Point.

person Blasanka    schedule 27.05.2017

Пусть, у Вас есть 2 класса. Это: Class A и Class B

В классе A у вас есть частная переменная экземпляра.

Класс А:

Class A {
    private int a;

    public int getA() {
        return A;
    }

}

Теперь вы хотите получить доступ к переменной с именем a из Class A из Class B. Но переменная является частной. Итак, теперь нам нужен метод получения, так как метод получения является общедоступным.

Класс Б:

Class B {
    public void fetchA() {
        A classA = new A();
        int a = classA.getA();
    }
}

В этом случае нам нужны геттеры.

person Avijit Karmakar    schedule 27.05.2017