Проверка условия перед инициализацией значения в конструкторе - PullRequest
0 голосов
/ 22 октября 2019

У меня есть упражнение, в котором я должен создать прямоугольник, основанный на противоположных вершинах (точках). У меня есть класс Point для инициализации точек, а затем я использую их для создания прямоугольника (рассчитать ширину, высоту, площадь ..). Я хотел бы проверить условие, если значения точек x или y не равны перед инициализацией значения в конструкторе прямоугольника. Я пытался сделать это через сеттер, но я не уверен, как передать его конструктору. Как это сделать правильно - передать значение после проверки условия?

public class Point {

    private double x;
    private double y;

    public Point(double x, double y) {
        this.x = x;
        this.y = y;
    }
    public double getX() {
        return x;
    }
    public double getY() {
        return y;
    }
}


public class Rectangle {

    Point p1;
    Point p2;


    public Rectangle(Point p1, Point p2) {
            this.p1 = p1;
            this.p2 = p2;
    }
    public void setPoints() {
        boolean rectangleCondition = (p1.getX() != p2.getX()) && (p1.getY() != p2.getY());
        if(rectangleCondition) {
            Rectangle.p1 = p1;
            Rectangle.p2 = p2;
        }

    }

Ответы [ 3 ]

4 голосов
/ 22 октября 2019

Вам просто нужно сделать это в конструкторе и указать p1 и p2, поскольку нулевой объект является недействительным условием

public Rectangle(Point p1, Point p2) {
    if(p1.getX() != p2.getX() && p1.getY() != p2.getY()){
        this.p1 = p1;
        this.p2 = p2;
    }
}

Или создать точки по умолчанию:

public Rectangle(Point p1, Point p2) {
    if(p1.getX() != p2.getX() && p1.getY() != p2.getY()){
        this.p1 = p1;
        this.p2 = p2;
    }else{
        this.p1 = new Point(0,0);
        this.p2 = new Point(1,1);
    }
}

Или сгенерировать исключение

public Rectangle(Point p1, Point p2) {
    if(p1.getX() != p2.getX() && p1.getY() != p2.getY()){
        this.p1 = p1;
        this.p2 = p2;
    }else{
        throw new IllegalArgumentException();
    }
}

Также помните, что Rectangle.p1 не может работать, потому что атрибуты для каждого экземпляра, вызов атрибута like означает, что он глобален для класса, иопределено с помощью static ключевого слова

static Point globalPointForClass;
1 голос
/ 23 октября 2019

Если вам абсолютно необходима валидация и, следовательно, ваш if-else вне конструктора, затем измените его и вызовите метод setpoints из вашего конструктора:

public Rectangle(Point p1, Point p2) {
    this.setPoints(p1,p2);
}

private void setPoints(Point p1, Point p2) {
    boolean rectangleCondition = (p1.getX() != p2.getX()) && (p1.getY() != p2.getY());
    if (rectangleCondition) {
        this.p1 = p1;
        this.p2 = p2;
    }
    else{
        throw new IllegalArgumentException("x1/x2 y1/y2 shouldn't be equal");
    }
}
0 голосов
/ 22 октября 2019

Один из вариантов, который вы можете использовать, - заставить setPoints вернуть результат rectangleCondition.

public boolean setPoints(Point p1, Point p2){

        boolean rectangleCondition = (p1.getX() != p2.getX()) && (p1.getY() != p2.getY());

        if(rectangleCondition) {
            Rectangle.p1 = p1;
            Rectangle.p2 = p2;
        }

        return rectangleCondition;
}

Затем в конструкторе:

public Rectangle(Point p1, Point p2) {
            if(setPoints(p1, p2))
               //do what you want here
    }
  • В настоящее времявы проверяете, равны ли они в установщике, но устанавливаете их независимо от конструктора, поэтому, возвращая логическое значение из setPoints, вы можете программировать логику, основываясь на том, можете ли вы установить их или нет.

Это позволяет вам «передать» значение конструктору, но, как отмечали другие, это может усложнить процесс, и вы можете проверить в конструкторе.

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