Ich bin in einer Situation, in der ich veränderbare Versionen von Dingen wie Integer verwenden möchte. Muss ich diese Klassen verwenden (siehe unten) oder ist in Java etwas integriert?
http://www.java2s.com/Code/Java/Data-Type/Amutableintwrapper.htm
n
Kalorien gespeichert wird , das aufgebraucht / ergänzt werden kann) ist es möglicherweise besser, eine nach der Verwendung benannte Klasse zu verwenden (z. B.class FoodItem { int calories; }
weil es klarer ist und Methoden dies können wird bei Bedarf später hinzugefügt.int
funktioniert nicht so, als ob es in einer Methode inkrementiert wäre, dann wird der Wert in der anderen Methode nicht wiedergegeben.Antworten:
Nein, Java hat diese nicht eingebaut. Und das hat einen Grund. Die Verwendung veränderlicher Typen ist gefährlich, da sie leicht missbraucht werden können. Darüber hinaus ist es sehr einfach zu implementieren. Zum Beispiel hat commons-lang eine
MutableInt
.quelle
Sie können den Wert jederzeit in ein Array
int[] mutable = {1};
einschließen, wenn das Einfügen des Codes für eine veränderbare Wrapper-Klasse zu umständlich ist.quelle
Seit JDK 1.5 hat Java nun
java.util.concurrent.atomic.AtomicInteger
Dies ist eine thread-sichere veränderbare Ganzzahl, ein Anwendungsbeispiel:
final AtomicInteger value = new AtomicInteger(0);
dann später:
quelle
Hier ist eine kleine Klasse, die ich für eine veränderbare Ganzzahl erstellt habe:
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; } }
Sie können dies leicht auf jedes andere Grundelement erweitern. Natürlich sollten Sie, wie alle anderen sagen, vorsichtig damit umgehen.
quelle
MutableInteger
,MutableDouble
,MutableString
usw. , sondern haben stattdessen einMutable<Integer>
,Mutable<Double>
... Die Overhead - Speicher (die VerwendungInteger
überint
wird in der Regel nicht in Betracht fallen. Aber Sie erhalten eine einzelne, gebrauchsfertige Klasse, die die meisten Fälle behandeln kann (Wenn Sie möchten, dass Ihre Ganzzahl vergleichbar oder ähnlich ist, müssen Sie dennoch eine UnterklasseSie können ein nnnn [] als veränderbares Objekt für jeden primitiven Typ verwenden, wie @Alexandre vorschlägt. Java verfügt außerdem über AtomicInteger und AtomicLong.
IMHO int ist normalerweise eine bessere Wahl als Integer und das ist veränderlich.
Können Sie näher erläutern, warum Sie ein Mehrfachobjekt benötigen? Vielleicht gibt es einen anderen Weg, um dasselbe zu erreichen.
quelle
int
ist immer veränderlich, es sei denn, es ist auchfinal
Integer a = 4;
danna = 5;
gültiger Code, aberInteger
nicht veränderbar.Integer
Instanzen nicht veränderbar sind, selbst wenn Verweise darauf vorhanden sind, aber das ist ein anderer Typ.int
ist nicht veränderbar, denn wenn Sie es an eine Methode übergeben, kann die Methode ihren Wert nicht ändern und den neuen Wert in der aufrufenden Methode wiedergebenAtomicInteger
wurde bereits erwähnt. MutableDouble
s können mit emuliert werdenAtomicReference<Double>
. Die bereits erwähnten Warnungen gelten und es ist ein schlechter Stil, aber manchmal haben Sie Code wie diesendouble sum=0 for (Data data:someListGenerator()) sum+=data.getValue()
und möchten es im funktionalen Java 8-Stil umgestalten. Wenn der Code dieses Muster folgt , sondern fügt einen erheblichen Aufwand , um es, die vernünftigste Umwandlung könnte sein
AtomicReference<Double> sumref=new AtomicReference<>(0d); someStreamGenerator().forEach(data-> sumref.set(sumref.get().doubleValue()+data.getValue())); double sum=sumref.get().doubleValue();
Das ist natürlich zumindest fragwürdiger Stil. Aber ich befand mich mehr als einmal in einer Situation mit einer verdrehten Schleife über einem
ResultSet
Computer, in der teilweise drei verschiedene Informationen daraus kumuliert wurden. Dies macht es wirklich schwierig, den Code in den richtigen Funktionsstil zu konvertieren. Das Konvertieren der kumulierten Teile nach dem obigen Muster schien mir ein vernünftiger Kompromiss zwischen sauberem Code und stark vereinfachtem Refactoring zu sein.quelle
someStreamGenerator().mapToDouble(Data::getValue).sum()
. Selbst für die Kumulierung von drei verschiedenen Informationen gibt es eine funktionale Möglichkeit, indem SieStream.reduce
oder verwendenStream.collect
. Ich sehe keinen Grund, jede Schleife in ein funktionales Codefragment umzugestalten, aber wenn Sie diesen Weg gehen möchten, sollten Sie ihn bis zum Ende gehen.for
undforeach
kann Teile komplexer Frameworks sein, die funktional neu geschrieben werden, sodass Sie den Rest des Codes irgendwie um sie herum ausrichten müssen.Sie können das org.omg.CORBA-Paket (oder nur die benötigte Klasse) importieren und darin die Holder-Klassen verwenden.
Beispielsweise hat es den "IntHolder", in dem das Feld, in dem die Ganzzahl gespeichert ist, öffentlich ist und Zugriff zum Ändern bietet.
public static void triple(IntHolder x){ x.value = 3 * x.value; } IntHolder mutableInt = new IntHolder(10); triple(mutableInt); System.out.println(mutableInt.value);
Es hat auch "LongHolder" und "DoubleHolder" und Tonnen von anderen, die Sie verwenden können. Mit Vorsicht verwenden.
Hier ist die API dafür: https://docs.oracle.com/javase/7/docs/api/org/omg/CORBA/package-summary.html
quelle