web-dev-qa-db-fra.com

Java a-t-il des types mutables pour Integer, Float, Double, Long?

Je suis dans une situation où je veux utiliser des versions mutables de choses comme Integer. Dois-je utiliser ces classes (ci-dessous) ou Java a-t-il intégré quelque chose?

http://www.Java2s.com/Code/Java/Data-Type/Amutableintwrapper.htm

68
smuggledPancakes

Non, Java ne les a pas intégrés. Et c'est pour une raison. L'utilisation de types mutables est dangereuse, car ils peuvent facilement être mal utilisés. De plus, il est vraiment facile à implémenter. Par exemple, commons-lang a un MutableInt .

46
Bozho

Vous pouvez toujours envelopper la valeur dans un tableau comme int[] mutable = {1}; si l'inclusion du code pour une classe wrapper mutable est trop lourde.

77
Alex Jasmin

Depuis JDK 1.5 Java a maintenant Java.util.concurrent.atomic.AtomicInteger

Il s'agit d'un entier mutable thread-safe, exemple d'utilisation:

final AtomicInteger value = new AtomicInteger(0);

puis plus tard:

value.incrementAndGet();
40
Clive

Voici une petite classe que j'ai faite pour un entier mutable:

public class MutableInteger {
    private int value;
    public MutableInteger(int value) {
        this.value = value;
    }
    public void set(int value) {
        this.value = value;
    }
    public int intValue() {
        return value;
    }
}

Vous pouvez facilement l'étendre à n'importe quelle autre primitive. Bien sûr, comme tout le monde le dit, vous devez l'utiliser avec prudence.

8
VinceFior

Vous pouvez utiliser un nnnn [] comme objet modifiable pour tout type primitif comme le suggère @Alexandre, Java a également AtomicInteger et AtomicLong.

IMHO int est généralement un meilleur choix que Integer et qui est mutable.

Pouvez-vous plus de détails sur les raisons pour lesquelles vous avez besoin d'un objet multiple, peut-être qu'il existe une autre façon de réaliser la même chose.

7
Peter Lawrey

AtomicInteger a déjà été mentionné. Mutable Doubles peut être émulé avec AtomicReference<Double>. Les avertissements déjà mentionnés s'appliquent et c'est un mauvais style, mais parfois vous avez du code comme celui-ci

double sum=0
for (Data data:someListGenerator())
  sum+=data.getValue()

et souhaitez le refactoriser dans un style fonctionnel Java 8 style. Si le code suit ce modèle mais lui ajoute une complexité considérable, la conversion la plus judicieuse pourrait être

AtomicReference<Double> sumref=new AtomicReference<>(0d);
someStreamGenerator().forEach(data->
  sumref.set(sumref.get().doubleValue()+data.getValue()));
double sum=sumref.get().doubleValue();

Bien sûr, c'est au moins un style discutable. Mais je me suis retrouvé plus d'une fois dans une situation avec une boucle torsadée sur un ResultSet informatique et en cumulant en partie trois informations différentes. Cela rend très difficile la conversion du code en style fonctionnel approprié. La conversion des parties cumulées selon le modèle ci-dessus m'a semblé un compromis raisonnable entre le code propre et le refactoring simplifié.

5
Dirk Hillbrecht

Vous pouvez importer le package org.omg.CORBA (ou simplement la classe dont vous avez besoin) et vous pouvez y utiliser les classes Holder.

Par exemple, il a le "IntHolder" où le champ où il stocke l'entier est public, donnant accès à le modifier.

public static void triple(IntHolder x){
    x.value = 3 * x.value;
}

IntHolder mutableInt = new IntHolder(10);
triple(mutableInt);     
System.out.println(mutableInt.value);

Il a également "LongHolder" et "DoubleHolder" et des tonnes d'autres que vous pouvez utiliser. Utiliser avec précaution.

Voici l'api pour cela: https://docs.Oracle.com/javase/7/docs/api/org/omg/CORBA/package-summary.html

2
Erkan Uretener