Klasse Immutable

javacup

Mitglied
Hallo :),
ich bin mir gerade nicht sicher dem Entwurfsmuster "Immutable". Kann eine solche Klasse ein privates nicht finales Attribut haben, das sich manchmal ändert. Kann ich in einer "immutablen" Klasse beispielsweise das Attribut
Java:
private int methodenaufrufe=0;
benutzten, das jedes mal um eins erhöht wird, wenn irgendeine Methode der Klasse aufgerufen wird? Es zählt also die Methodenaufrufe. Der Benutzter kann dieses Attribut nicht bewusst ändern. Es wird auch nicht verwendet beim Berechnen des Hash-Wertes und beim Vergleichen mit anderen Objekten.
Ist die Klasse immer noch "immutable"?
 

javacup

Mitglied
Ok, danke schonmal.
Mein Objekt wäre also technisch nicht immutable. Hat es dadurch irgendwelche Nachteile gegenüber richtigen "immutablen" Objekten?
 

FArt

Top Contributor
"technisch nicht" immutable? "richtig" immutable?
Entweder es ist unveränderbar oder nicht, dazwischen gibt es nichts. Die Nachteile sind dann das Gegenteil der Vorteile, die z.B. in Joes Link aufgeführt werden.
 

Landei

Top Contributor
Wenn sich ein Objekt wie ein immutables Objekt verhält und von außen auf keine Weise Unterschied festzustellen ist, dann ist es für mich ein immutables Objekt.

Als Beispiel sei Lazy Initialization genannt. Angenommen ich habe ein wirklich großes oder kompliziertes Objekt (z.B. einen Graphen mit mit ein paar tausend Knoten), das eventuell in eine HashMap gepackt werden soll. Den Hashwert davon zu berechnen ist dann eine aufwendige Operation, die ich vermeiden will, wenn ich sie nicht benötige. Also würde ich schreiben:

Java:
class Foo {

   private Integer hashValue = null;

   public int hashCode() {
      if (hashValue == null) {
         hashValue = ergebnisEinerLangwierigenBerechnung();
      }
      return hashValue; 
   }
}

Strenggenommen ist Foo kein unveränderliches Objekt, es ändert seinen inneren Zustand. Aber trotzdem wäre es für die Außenwelt immutable, weil man keinen Unterschied feststellen könnte (Achtung: Mein einfaches Foo-Beispiel müsste ich dazu noch thread-safe machen).
 
M

maki

Gast
Strenggenommen ist Foo kein unveränderliches Objekt, es ändert seinen inneren Zustand.
Wobei sich der Zustand des hashcodes eigentlich nur von "nicht-initialisiert" auf "initialisiert" ändert, lazy-init ist kein Problem für Immutable Objekte, sondern ein Vorteil davon.
Bei dem "methodenaufrufe" Beispiel ist das anders.
 

ice-breaker

Top Contributor
Der Status des Objektes mag sich streng genommen ändern, er beeinflusst jedoch nicht das Verhalten (Methoden) und der verändere Status lässt sich auch nicht auslesen oder verändern (Getter und Setter).
Streng genommen ist dieses Attribut also sowieso unnütz.
 

Illuvatar

Top Contributor
Also zum Beispiel von Anfang würd ich sagen:
Entweder das Attribut beeinflusst das Verhalten des Objekts nicht. Dann könnte man es eigentlich auch gleich weglassen, und ich würde das Ding schon immutable nennen.
Aber man baut doch keinen Counter in seine Klasse, wenn der dann nichts bewirkt? Und wenn doch... dann ist es eben nicht immutable :)
 
M

maki

Gast
Wertobjekte sind immer gute Kandidaten für Immutables, diese haben wenig Logik und ihre Identität hängt von ihren Werten ab.

Wenn Immutables allerdings Refrenzen halten auf mutable Objekte, sind sie selber keine Immutables mehr.
Meistens geht man umgekehrt vor, so das ein Objekt mit viel Logik mutable ist, und Referenzen hält auf Immutable Objekte.
 

Landei

Top Contributor
Wertobjekte sind immer gute Kandidaten für Immutables, diese haben wenig Logik und ihre Identität hängt von ihren Werten ab.

Das ist eine Sichtweise, die sich oft in der OO-Welt findet. Dabei können gerade komplexe Objekte von Unveränderbarkeit profitieren. Ich halte z.B. Collections für gute Kandidaten. Damit meine ich nicht etwa das unbrauchbare Collections.unmodifiable... Zeug, sondern Sachen wie pcollections oder functional java. In Scala geht meine Verwendung veränderlicher Collections inzwischen gegen null. Generell verwende ich dort bestimmt zu 95% unveränderliche Objekte, und mein Code ist dadurch nicht langsamer geworden, sondern einfacher und stabiler.
 
M

maki

Gast
Ja Landei, Copy-on-write ist 'ne gute Sache für Multiprozessorsysteme, aber mit "Objekte mit viel Logik" meinte ich keine Collections, denn diese sind für mich keine Objekte mit Logik oder komplex, können ruhig immutable sein, Zustände brauchen sie ja keine.
 

FArt

Top Contributor
Der Benutzter kann dieses (...private...) Attribut nicht bewusst ändern. Es wird auch nicht verwendet beim Berechnen des Hash-Wertes und beim Vergleichen mit anderen Objekten.
Ist die Klasse immer noch "immutable"?
Nur mal nachgehackt... (lol, wollte ich auch mal schreiben)...
der Poster ging davon aus, dass sein Objekt aufgrund dieser Aussage immutable ist, was nicht stimmen muss. Es kommt nicht darauf an, ob das Attribut bewusst oder unbewusst geändert werden kann und privat ist, sondern ob die Änderung in irgendeiner Form sichtbar ist ... dazu kann auch interner Zustand zählen. Würdest du von einem immutable Objekt erwarten, dass sich die Ausgabe der toString() Methode ändert, z.B. weil sich der Methodenzähler erhöht hat? Oder sich Logausgaben der selben Methode ändern? Schwieriger sieht es aus, wenn ein Objekt serialisierbar ist. Und ganz schlimm sieht es aus, wenn dieser Satz nicht mehr stimmt: "Since they cannot change state, they cannot be corrupted by thread interference or observed in an inconsistent state.". Auch wenn der Status also nicht aktiv geändert werden kann, kann er in obigem Fall inkonsistent sein => nicht immutable.
... und sie dreht sich doch...
 
S

SlaterB

Gast
vielleicht reicht es, wenn ein Interface immutable ist, die Klasse also nur hinsichtlich bestimmter anderer Klassen und packages
(die nur die public-Methoden sehen),
intern wird einiges verändert, worauf gewisse interne Kontrollstrukturen, Logging, Reflection-Zugriffe Rücksicht nehmen müssen, die können das Objekt nicht als Immutable ansehen,
der große Rest der 'normalen' Programmlogik muss sich für diesen Teil aber nicht interessieren
 

Empire Phoenix

Top Contributor
Immutable objecte, hm enumerations sind in java classenverwand (soweit ich weiß setzt der compiler die sogar in eine Classe um)
Netzwerknachrichten, die festen inhalt haben und objectbasiert gemacht werden, sind normalerweise sinnvollerweise nicht vom Client veränderbar. So gesehen sind sie auf Clientseite immutable.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Methodenübersicht einer Klasse einsehen Allgemeine Java-Themen 14
Jose05 Java-Klasse im extra cmd-Fenster ausführen Allgemeine Java-Themen 3
torresbig Klasse mit extends Calendar über Methoden ändern (Hirnblockade) Allgemeine Java-Themen 7
A Zweite Service Klasse beim Kompilieren Allgemeine Java-Themen 6
B Ein Objekt einer Klasse mehreren anderen Klassen zur Verfügung stellen? Allgemeine Java-Themen 6
Atten007 Java-Klasse auf macOS entpacken? Allgemeine Java-Themen 2
M Klasse durch Klassen Aufteilung verbessern, aber wo? Allgemeine Java-Themen 1
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12
H Kombination Interface und Abstrakte Klasse bei Generics Allgemeine Java-Themen 3
EinNickname9 Best Practice Singleton und Singleton mit Instanz zu anderer Klasse -Pattern Allgemeine Java-Themen 30
Y ImagePanel von anderer Klasse in eine MainFrame Klasse hinzufügen. Allgemeine Java-Themen 1
Lukas2904 Schleife mit ansteuerung einer Klasse Allgemeine Java-Themen 5
d.lumpi Aus Einer Klasse auf ein Objekt einer anderen Klasse Zugreifen Allgemeine Java-Themen 1
missy72 Klassen Eigene Klasse MessageWindow ähnlich der Alert Klasse Allgemeine Java-Themen 2
Drachenbauer wie kann ich alle instanzen einer Klasse durchsehen, ohne, dass diese in einer Liste erzeugt wurden? Allgemeine Java-Themen 11
kanywayne Java programmieren: Polynom Klasse Allgemeine Java-Themen 4
L Die abzuleitende Klasse als Parameter übergeben Allgemeine Java-Themen 4
S Klassen Einfügen von unbekannter menge an Variablen in eine Klasse mithilfe von ASM Allgemeine Java-Themen 5
C Klasse mit Mockito simulieren Allgemeine Java-Themen 9
P einen public <Optinal String> in einer anderen Klasse mit einem Int vergleichen Allgemeine Java-Themen 2
S Wenn eine Klasse zwei Interfaces mit derselben Methodensignatur implementiert: welche wird aufgerufen? Allgemeine Java-Themen 15
Thallius Key/Value Table in Klasse einlesen Allgemeine Java-Themen 14
S static in Interface und Klasse Allgemeine Java-Themen 2
W Was genau sind IOTools? Kann ich stattdessen nicht die Scanner Klasse verwenden? Allgemeine Java-Themen 3
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
X Collections Gibt es eine Klasse welche die Vorteile von List und HashMap vereint, aber konstante Laufzeit (O(1)) hat in Java? Allgemeine Java-Themen 4
D javassist API Klasse in MethodCall ermitteln Allgemeine Java-Themen 8
kodela Klasse mit "gezipten" Daten Allgemeine Java-Themen 6
J Builder Klasse mit Lombok bauen Allgemeine Java-Themen 2
L Operatoren Java Reflections: Alle Methoden einer Klasse aufrufen ohne Exceptions Allgemeine Java-Themen 5
M [SOAP] - Klasse aus WSDL ausschließen Allgemeine Java-Themen 2
N Generic Type einer Generischen Klasse während der Laufzeit bekommen Allgemeine Java-Themen 2
X Klassen Klasse BreakIterator Allgemeine Java-Themen 6
R Arraylist in andere Klasse leiten und bearbeiten Allgemeine Java-Themen 10
kodela Klassen Klasse "vergisst" ihre Daten Allgemeine Java-Themen 2
pkm Kann eine ServerSocket-Klasse nicht stateful sein? Allgemeine Java-Themen 4
E Socket Dynamische Klasse von ObjectOutputStream lesen. Allgemeine Java-Themen 8
M Matcher-Klasse findet match nicht Allgemeine Java-Themen 6
cool_brivk24 Variablen abfragen von Boolean von anderer Klasse Allgemeine Java-Themen 12
S Seltsames Ergebnis mit Date-Klasse Allgemeine Java-Themen 6
J int Werte in einer anderen Klasse in Arrays speichern Allgemeine Java-Themen 3
D Warum kann ich eine (deflaut) Klasse aus einer Libary in einem anderen Projekt benutzen? Allgemeine Java-Themen 3
Neoline Klassen Singleton Klasse buchmanager Allgemeine Java-Themen 19
M Kapselung Modellierung von Intervallen: Klasse Interval Allgemeine Java-Themen 4
B Übernommene Variablen(werte) aus der Main-Klasse ändern? Allgemeine Java-Themen 9
ReinerCoder Klasse kann nicht public deklariert werden Allgemeine Java-Themen 2
ReinerCoder Methode einer Klasse meldet Fehler "misplaced construct(s)" Allgemeine Java-Themen 13
I Collection - contains-Methode überschreiben (anonyme innere Klasse) Allgemeine Java-Themen 4
X Klassen File-Klasse wird als Directory markiert Allgemeine Java-Themen 8
S Methoden Liste soll Methode aus innerer Klasse aufrufen Allgemeine Java-Themen 4
J IndexOutOfBoundsException bei der Nutzung der Klasse Message von mime4j Allgemeine Java-Themen 5
P Array einer abstrakten Klasse Allgemeine Java-Themen 4
J Zugriff auf erstellte Objekte einer Klasse von einer Klasse ausserhalb Allgemeine Java-Themen 3
kodela Dynamisches Array in einer Klasse Allgemeine Java-Themen 5
M Was geschieht mit Java-Klasse, die aus ArrayList entfernt wird? Allgemeine Java-Themen 10
perlenfischer1984 Lombok Builder soll andere Klasse bauen Allgemeine Java-Themen 4
perlenfischer1984 Mit Lombok Builder Felder in Super Klasse füllen Allgemeine Java-Themen 12
T String aus While Schleife für ganze Klasse sichtbar machen Allgemeine Java-Themen 5
K Best Practice Auf die Klasse zugreifen im erzeugten ActionListener Allgemeine Java-Themen 2
K Mit Button neue Klasse öffnen Allgemeine Java-Themen 9
J Reflection mit Klasse und Subklasse Allgemeine Java-Themen 11
C Classpath Neue Klasse über einen Button ausführen Allgemeine Java-Themen 3
magdaStone Logikproblem Umschalten von booleans in anderer Klasse Allgemeine Java-Themen 7
P mehrer Verschiedene Objekte in einer Klasse erstellen. Allgemeine Java-Themen 4
A Java Klasse auf Tomcat während der Laufzeit austauschen Allgemeine Java-Themen 1
C Abstrakte Klasse, lokale Variable-Problem Allgemeine Java-Themen 1
N Vererbung Design-Problem mit vorhandenen, von der Klasse unabhängigen Methoden Allgemeine Java-Themen 12
Messoras Klassen Sämtliche Variablen einer Klasse übernehmen Allgemeine Java-Themen 6
H Methoden Methode 'updateItem' der Klasse 'TreeCell' Allgemeine Java-Themen 3
B Animierte Klasse schreiben - Wie? Allgemeine Java-Themen 9
M Klassen Eine Klasse in mehreren Klassen einbinden Allgemeine Java-Themen 11
N Methoden Methoden einer Klasse auf Grundlage eines Strings aufrufen Allgemeine Java-Themen 6
AssELAss Log4j Logging Ausgabe für jede Klasse in seperates File Allgemeine Java-Themen 2
L Eclipse JavaFX Klasse starten programmatisch Allgemeine Java-Themen 1
F Try/catch über ganze Klasse Allgemeine Java-Themen 9
L Von ArrayList abgeleitete Klasse nur mit bestimmten Objekten füllen Allgemeine Java-Themen 1
so_ein_Komischer Erste Schritte java Math Klasse finden? Allgemeine Java-Themen 2
J beans.instantiate(): Klasse kann nicht instanziiert werden Allgemeine Java-Themen 2
I Interface Interface / Klasse - wieso Abstract? Allgemeine Java-Themen 13
R Abstrakte Basisklasse und instanzierte Objekte der abgeleiteten Klasse als Basisklasse übergeben Allgemeine Java-Themen 2
F Methodenaufruf mit abgeleiteter Klasse als Arg... Allgemeine Java-Themen 10
M Klasse in separaten Thread ausführen.Wie genau? Allgemeine Java-Themen 2
A Best Practice Unterschied zwischen einer sauberen Dependency Injection und einer statischen Klasse Allgemeine Java-Themen 5
F Methoden in der Enumeration Klasse Allgemeine Java-Themen 1
S Die Initialisierung von Feldern in ableitender Klasse erzwingen..? Allgemeine Java-Themen 16
S Mit Generics Klasse erstellen die selbst T erweitert..? Allgemeine Java-Themen 4
M Variable außerhalb Klasse definierbar? Allgemeine Java-Themen 2
F Abstrakte Klasse in "For each" Schleife Allgemeine Java-Themen 1
F Enums als innere Klasse sinnvoll? Allgemeine Java-Themen 3
C Klassen Problem mit Funktion einer Generischen Klasse die ein Interface implementiert Allgemeine Java-Themen 0
K Problem: Java-Klasse mit mehreren Threads als eigenen Prozess starten Allgemeine Java-Themen 3
N Automatisches einfügen einer selbst generierten ID in Klasse mit Annotation Allgemeine Java-Themen 8
F Klassen Klasse bei Button klick öffnen Allgemeine Java-Themen 11
F OOP Datenbank-Klasse überall verfübar Allgemeine Java-Themen 2
E KeyCode in anderer Klasse speichern Allgemeine Java-Themen 2
B Klassen Eigene Klasse als Array benutzen Allgemeine Java-Themen 3
M File IO Klasse ... wie einbinden Allgemeine Java-Themen 6
M XML DOM Klasse die Iterable Implementiert Allgemeine Java-Themen 1
P Name der Parent Klasse abfragen Allgemeine Java-Themen 8
D Arraylist eigener Klasse an iReport übergeben Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben