Je suis censé vérifier la valeur et si ce n'est pas la valeur, je ne mets pas à jour la valeur. Et si l'entrée est valide, je la renvoie.

Exemple reproductible minimal:

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;
    }
    ...
}
2
Christian 4 nov. 2019 à 12:39

4 réponses

Peut-être un cas d'utilisation pour les constantes:

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
deHaar 4 nov. 2019 à 11:06
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");
}

Vous avez oublié d'écrire la variable de champ de votre classe.

Un setter doit remplacer une variable de champ. Un setter doit remplacer une variable de champ. Il ne restitue donc rien au lieu de booléen dans la tête de méthode. Si les paramètres sont incorrects, lancez une exception (aussi significative que possible).

Astuce: je ne distribuerais pas mes constantes comme 1.06 ou 1.08 n'importe où dans le code. Vous pouvez le définir comme suit:


public class student {

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

    // other code below
}

Avantage: si nécessaire, vous ne devez modifier la constante qu'en un seul endroit. La probabilité que vous manquiez et écriviez 1.07 au lieu de 1.06 est plus faible.

2
pb11pb 4 nov. 2019 à 10:20

Je pense que vous avez juste oublié de définir la nouvelle valeur.

Par conséquent, cela devrait fonctionner si vous le faites comme ceci:

public void setMultiplier(double multiplier) {


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

De plus, les setters sont généralement void au lieu de booléens et n'ont aucune valeur de retour.

0
THess 4 nov. 2019 à 09:44

Un setter doit mettre à jour une valeur et ne renvoie pas de valeur (le rôle de getter), donc son type de retour doit être void et non boolean

public void setMultiplier(double multiplier) {
    if( multiplier == 1.08 * 1.06 || multiplier == 1.08 || multiplier == 1.06 ) {
        this.multiplier = multiplier; 
    }
}
0
azro 4 nov. 2019 à 09:43