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
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
nKalorien 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.
intfunktioniert 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.
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.
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:
value.incrementAndGet();
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.
MutableInteger, MutableDouble, MutableStringusw. , sondern haben stattdessen ein Mutable<Integer>, Mutable<Double>... Die Overhead - Speicher (die Verwendung Integerüber intwird 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 Unterklasse
Sie 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.
intist immer veränderlich, es sei denn, es ist auchfinal
Integer a = 4;dann a = 5;gültiger Code, aber Integernicht veränderbar.
IntegerInstanzen nicht veränderbar sind, selbst wenn Verweise darauf vorhanden sind, aber das ist ein anderer Typ.
intist 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 wiedergeben
AtomicIntegerwurde bereits erwähnt. Mutable Doubles können mit emuliert werden AtomicReference<Double>. Die bereits erwähnten Warnungen gelten und es ist ein schlechter Stil, aber manchmal haben Sie Code wie diesen
double 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 ResultSetComputer, 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.
someStreamGenerator().mapToDouble(Data::getValue).sum(). Selbst für die Kumulierung von drei verschiedenen Informationen gibt es eine funktionale Möglichkeit, indem Sie Stream.reduceoder verwenden Stream.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.
forund foreachkann 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