Сеттер - Проверка значения - PullRequest
1 голос
/ 04 ноября 2019

Я должен проверить значение, и если это не значение, я не обновляю значение. И если ввод действителен, то я возвращаю его.

Минимальный воспроизводимый пример:

public class Student {

    private int studentId;
    private String name;
    private double grade;
    private double multiplier;


    public double getMultiplier() {
        return multiplier;
    }

    /**
     * The setter for the multiplier must check that the value is either 1.08 *
     * 1.06 or 1.08 or 1.06
     * 
     * If not, then do not update the value
     * 
     * @param multiplier
     * @return if the input was valid
     */
     public boolean setMultiplier(double multiplier) {

         if( multiplier == 1.08 * 1.06 || multiplier == 1.08 || multiplier == 1.06 ) { }
         return multiplier;
    }
    ...
}

Ответы [ 4 ]

2 голосов
/ 04 ноября 2019
public void setMultiplier(double multiplier) { // method head

    if (multiplier == 1.08 * 1.06 || multiplier == 1.08 || multiplier == 1.06) {
        this.multiplier = multiplier; // here the field variable is overwritten
    }

    throw new IllegalArgumentException("exception message");
}

Вы забыли написать переменную поля вашего класса.

Сеттер должен переопределить переменную поля. Сеттер должен переопределить переменную поля. Он ничего не возвращает, поэтому вместо логического значения в методе void. Если параметры неверны, выведите исключение (настолько значимое, насколько это возможно).

Совет: Я бы не распространял свои константы, такие как 1,06 или 1,08, в любом месте кода. Вы можете определить это следующим образом:


public class student {

    private static final double MEANINGFUL_NAME_0 = 1.06;
    private static final double MEANINGFUL_NAME_1 = 1.08;

    // other code below
}

Преимущество: При необходимости вы должны изменить константу только в одном месте. Вероятность того, что вы пропустите и напишите 1.07 вместо 1.06, ниже.

0 голосов
/ 04 ноября 2019

Возможно использование сценария для констант:

private static final double ONE_DOT_ZERO_SIX = 1.06f;
private static final double ONE_DOT_ZERO_EIGHT = 1.08f;

/**
 * Just to know if it is valid
 */
public boolean setMultiplier(double multiplier) {
    return (multiplier == ONE_DOT_ZERO_SIX || multiplier == ONE_DOT_ZERO_EIGHT
            || multiplier == (ONE_DOT_ZERO_SIX * ONE_DOT_ZERO_EIGHT));
}

/**
 * Return the multiplier if it is valid, otherwise 1
 */
public double setMultiplier(double multiplier) {
    if (multiplier == ONE_DOT_ZERO_SIX || multiplier == ONE_DOT_ZERO_EIGHT
            || multiplier == (ONE_DOT_ZERO_SIX * ONE_DOT_ZERO_EIGHT)) {
        return multiplier;
    } else {
        // return any invalid multiplier, this one doesn't change values at least
        return 1;   
    }
}

/**
 * Set the correct multiplier or a substitute
 */
public void setMultiplier(double multiplier) {
    if (multiplier == ONE_DOT_ZERO_SIX || multiplier == ONE_DOT_ZERO_EIGHT
            || multiplier == (ONE_DOT_ZERO_SIX * ONE_DOT_ZERO_EIGHT)) {
        this.multiplier = multiplier;
    } else {
        // return any invalid multiplier, this one doesn't change values at least
        this.multiplier = 1;
    }
}
0 голосов
/ 04 ноября 2019

Я думаю, что вы просто забыли установить новое значение.

Поэтому оно должно работать, если вы делаете это так:

public void setMultiplier(double multiplier) {


    if( multiplier == 1.08 * 1.06 || multiplier == 1.08 || multiplier == 1.06 ) {
        this.multiplier = multiplier;
    }
}

Кроме того, сеттеры обычно вместо этого voidлогического и не имеют возвращаемого значения.

0 голосов
/ 04 ноября 2019

A setter должен обновить значение и не возвращает значение (роль getter), поэтому тип возвращаемого значения должен быть void, а не boolean

public void setMultiplier(double multiplier) {
    if( multiplier == 1.08 * 1.06 || multiplier == 1.08 || multiplier == 1.06 ) {
        this.multiplier = multiplier; 
    }
}
...