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

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

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

    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 très facile de le mettre en œuvre. Par exemple, commons-lang a un MutableInt .

    Vous pouvez toujours envelopper la valeur dans un tableau comme int[] mutable = {1}; si inclure le code pour une classe de wrapper mutable est trop lourd.

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

    Ceci est un entier mutable sans fil, exemple d’utilisation:

     final AtomicInteger value = new AtomicInteger(0); 

    puis plus tard:

     value.incrementAndGet(); 

    Voici un petit cours que j’ai fait 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 pourriez facilement étendre cela à toute autre primitive. Bien sûr, comme tout le monde le dit, vous devriez l’utiliser avec précaution.

    Vous pouvez utiliser un nnnn [] comme object mutable 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 la raison pour laquelle vous avez besoin d’un object multiple, peut-être y a-t-il une autre façon de réaliser la même chose.

    AtomicInteger a déjà été mentionné. Les Double AtomicReference peuvent être émulés avec AtomicReference . Les avertissements déjà mentionnés s’appliquent et sont de mauvais style, mais parfois vous avez du code comme celui-ci

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

    et que vous voulez le refactoriser dans le style Java 8 fonctionnel. Si le code suit ce schéma mais lui ajoute une complexité considérable, la conversion la plus judicieuse pourrait être

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

    Bien sûr, c’est un style au moins discutable. Mais je me suis retrouvé plus d’une fois dans une situation avec une boucle torsadée sur un calcul de ResultSet et en cumulant partiellement 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 schéma ci-dessus me semblait un compromis raisonnable entre le code propre et le refactoring simplifié.

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

    Par exemple, il a le “IntHolder” où le champ où il stocke l’entier est public, donnant access à le modifier.

     public static void sortingple(IntHolder x){ x.value = 3 * x.value; } IntHolder mutableInt = new IntHolder(10); sortingple(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 le api pour cela: https://docs.oracle.com/javase/7/docs/api/org/omg/CORBA/package-summary.html