Как проверить наличие атрибутов у незаданного объекта - PullRequest
2 голосов
/ 23 марта 2019

Я пытаюсь сформировать метод для вызова объекта, чтобы проверить, содержит ли он некоторые атрибуты в классе

Это код, который я пробовал до сих пор

public class BoundingBox {

    public int x, y, width, height;

    public BoundingBox() {

    }

    public Integer getX() {
        return x;
    }

    public void setX(Integer x) {
        this.x = x;
    }

    public Integer getY() {
        return y;
    }

    public void setY(Integer Y) {
        this.y = y;
    }

    public boolean contains(int x, int y) {
        if (x == getX() & y == getY()) {
            return true;
        } else {
            return false;
        }
    }
}

Однако, когда я создал объект со всеми атрибутами, содержащими значение 10, и протестировал его с помощью object.contains (15,15), он не возвращает false

Ответы [ 4 ]

2 голосов
/ 23 марта 2019

В Java оператор & может принимать различные значения:

  • &: Битовый оператор
  • &&: Логический оператор

В операторе if if (x == getX() & y == getY()) { вместо логического оператора && вы использовали битовый оператор & .
Плюс в методе setY была опечатка, и, как утверждает @alvinalvord, сравнение int с Integer может дать неожиданные результаты.

Измените свой код следующим образом, и он будет работать:

public class BoundingBox {

    public int x, y, width, height;

    public BoundingBox() {

    }

    public Integer getX() {
        return x;
    }

    public void setX(Integer x) {
        this.x = x;
    }

    public Integer getY() {
        return y;
    }

    public void setY(Integer y) {
        this.y = y;
    }

    public boolean contains(int x, int y) {
        return getX().equals(x) && getY().equals(y);
    }
}

Альтернативный код

Или, если нет особых причин сохранять переменные Integer, вы можете изменить код следующим образом:

public class BoundingBox {

    public int x, y, width, height;

    public BoundingBox(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }

    public boolean contains(int x, int y) {
        return getX() == x && getY() == y;
    }
}
1 голос
/ 23 марта 2019

Сравнение int и Integer также имеет некоторые проблемы см. Здесь .Лучший возврат int для ваших добытчиков.

0 голосов
/ 23 марта 2019

Ваш метод setY содержит ошибку:

 public void setY(Integer Y) {
        this.y = y;
 }

Y - капитал, поэтому this.y = y не работает. Эта строка кода не имеет смысла, поэтому вы получаете false, когда вы сравниваете y в методе contains(). Измените его на:

 public void setY(Integer y) {
            this.y = y;
 }
0 голосов
/ 23 марта 2019

В вашем тесте отсутствует амперсанд, он должен быть && вместо &. Одиночный амперсанд является побитовым И, не логическим И.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...