Как правильно обрабатывать параметр конструкторов

#java

#java

Вопрос:

Я прохожу один из онлайн-курсов по Java, и у меня есть небольшое недопонимание относительно обработки параметров конструкторов в этой конкретной ситуации. Условия просты: если значение параметра, которое передается при вызове конструктора, меньше 0, поле должно иметь значение 0; Итак, я вызываю конструктор при создании нового объекта

        Test test = new Test(1.125, -1.0);
  

Первый пример кода работает, и он выполняет свою работу (x = 1,125, y = 0), но является ли это правильным способом обработки параметра? (Я слышал, что это не так)
Кажется, что я на самом деле сначала изменил параметр, а не поле.

 public class Test{
    private double x;
    private double y;

    public Test(double x, double y) {
        if(x < 0){
            x = 0;
        }
        if(y < 0){
            y = 0;
        }
        this.x = x;
        this.y = y;
    }
}
  

Затем я действительно попытался правильно изменить поле. Передача тех же параметров при вызове конструктора (1.125, -1.0).

 public class Test{
    private double x;
    private double y;
        public Test(double x, double y) {
            if(x <= 0 amp;amp; y >= 0){
                this.x = 0;
                this.y = y;
            }
            if(y <= 0 amp;amp; x >= 0){
                this.y = 0;
                this.x = x;
            }
            if (x <= 0 amp;amp; y <= 0){
                this.x = 0;
                this.y = 0;
            }
            else{
                this.x = x;
                this.y = y;
            }
    }
}
  

По какой-то причине вызов конструктора установил значение поля для y равным -1.0.

Почему?

Разве я не исключил это в своих выражениях?

Комментарии:

1. Возможно, вы захотите связать if блоки с else if (...) помощью оператора and . В противном случае последний if-else блок отделяется от первых двух if операторов.

2. Вы могли бы использовать условный оператор : this.x = x < 0 ? 0 : x . Или используйте max: this.x = Math.max(0, x);

3. Нет ничего плохого в изменении двойных параметров. Они передаются как значения

4. Как сказал @Johnny Mopp, вы могли бы использовать условный оператор. Это просто и аккуратно

Ответ №1:

В случае, если вы пытались, код вводит блок else следующего if-else:

 if (x <= 0 amp;amp; y <= 0)
{
    this.x = 0;
    this.y = 0;
}
else
{
    this.x = x;
    this.y = y;
}
  

таким образом, переопределяется значение y, которое было присвоено вашим вторым оператором if . Вы должны использовать if-else if …else в своем коде.