547 votes

Coulée sûre longtemps à int en Java

Quelle est la manière la plus idiomatique de Java de vérifier qu'une distribution de long en int ne perd aucune information?

C'est ma mise en œuvre actuelle:

 public static int safeLongToInt(long l) {
    int i = (int)l;
    if ((long)i != l) {
        throw new IllegalArgumentException(l + " cannot be cast to int without changing its value.");
    }
    return i;
}
 

304voto

Jon Skeet Points 692016

Je pense que je le ferais aussi simplement que:

 public static int safeLongToInt(long l) {
    if (l < Integer.MIN_VALUE || l > Integer.MAX_VALUE) {
        throw new IllegalArgumentException
            (l + " cannot be cast to int without changing its value.");
    }
    return (int) l;
}
 

Je pense que cela exprime l'intention plus clairement que le casting répété ... mais c'est un peu subjectif.

Note d'intérêt potentiel - en C # ce serait juste:

 return checked ((int) l);
 

136voto

prasopes Points 1579

Avec la classe Ints de Google Guava:

 public static int safeLongToInt(long l) {
    return Ints.checkedCast(l);
}
 

29voto

Jaime Saiz Points 201

Avec BigDecimal:

 long aLong = ...;
int anInt = new BigDecimal(aLong).intValueExact(); // throws ArithmeticException
                                                   // if outside bounds
 

17voto

Vitaliy Kulikov Points 59

Voici une solution, au cas où vous ne vous souciez pas de la valeur au cas où il est plus grand que nécessaire;)

 public static int safeLongToInt(long l) {
    return (int) Math.max(Math.min(Integer.MAX_VALUE, l), Integer.MIN_VALUE);
}
 

7voto

Je prétends que le moyen le plus évident de voir si la conversion d'une valeur changé la valeur serait de fonte et de vérifier le résultat. Je voudrais, toutefois, de supprimer l'inutile exprimés lors de la comparaison. Je suis également pas trop vif sur une lettre des noms de variables (à l'exception des x et y, mais pas quand ils veulent dire de ligne et de colonne (parfois, respectivement)).

public static int intValue(long value) {
    int valueInt = (int)value;
    if (valueInt != value) {
        throw new IllegalArgumentException(
            "The long value "+value+" is not within range of the int type"
        );
    }
    return valueInt;
}

Toutefois, vraiment je voudrais éviter cette conversion si possible. Évidemment, parfois il n'est pas possible, mais dans ces cas - IllegalArgumentException est presque certainement le mauvais exception à être jeter aussi loin que le code du client est concerné.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X