Observable/Observer-Patterns

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo,

ich habe eine Frage zu MVC Patterns.
Bei diesen Patterns ruft man die Methode notifyObservers(Object obj) der Klasse Observable auf, um die Observers zu benachrichtigen. Dabei wird die Methode update(Observable obs, Object obj) der Observers aufgerufen.
In der API steht, dass man nicht voraussagen kann, in welcher Reihenfolge die Observers benachnichtigt werden.
Übrigens, ich habe keine Infos dazu gefunden, ob als Argument ubergegebene Objekte durch observers
manipuliert werden können/dürfen. Ich will, dass auf das als Argument übergegebene Objekt nur lesend zugegeriffen wird, da auch die andere Observers dieses Objekt brauchen.
Meine Frage ist, ob das eine Lösung ist, wenn ich ein Objekt X habe, und in meinem Observable
notifyObservers(final X) aufrufe?
 

SnooP

Top Contributor
Es sollte selbstverständlich nicht manipuliert werden. Wenn du das übergebene Argument also vorher finalisierst, kannst du das damit erreichen.
Andererseits wäre ich nie auf die Idee gekommen das Datenobjekt im Observer zu verändern.. schließlich soll da ja nur die Ausgabe stattfinden.
 
B

bygones

Gast
wieso erstellst du nicht einfach ein Immutable Objekt als Parameter für den Update ?
 

Murray

Top Contributor
Übrigens, ich habe keine Infos dazu gefunden, ob als Argument ubergegebene Objekte durch observers
manipuliert werden können/dürfen.
Das ist nicht verboten, aber - gerade wegen der von Dir bereits angesprochenen Reihenfolgeproblematik - nicht ganz ungefährlich.

Ich will, dass auf das als Argument übergegebene Objekt nur lesend zugegeriffen wird, da auch die andere Observers dieses Objekt brauchen.
Meine Frage ist, ob das eine Lösung ist, wenn ich ein Objekt X habe, und in meinem Observable
notifyObservers(final X) aufrufe?
Das geht so nicht (keine korrekte Syntax).

final kannst Du Du nur in der Deklaration einer Methode verwenden, und auch da hat es nicht die Bedeutung, die Du brauchst: final bedeutet nur, dass man die Variable nicht erneut zuweisen kann; das Object, auf das die Variable zeigt, kann sehr wohl geändert werden.

Bsp:
Code:
public void doThis( final MyObject param) {

  param.setSomeValue( null); //---erlaubt
  param = null; //--- nicht erlaubt
}
 

SnooP

Top Contributor
und außerdem würde es so ja die Methodensignatur kaputtmachen und das von Java vorgegebene Pattern könnte so zumindest nicht mehr benutzt werden.

Also wie deathbyaclown schon sagte - das übergebene Objekt selbst muss final - sprich immutable sein:
public final class MyDataObject und alle Member ebenfalls final...
 

Murray

Top Contributor
SnooP hat gesagt.:
und außerdem würde es so ja die Methodensignatur kaputtmachen und das von Java vorgegebene Pattern könnte so zumindest nicht mehr benutzt werden.

Das stimmt m.E. nicht:
Code:
import java.util.Observable;

public class Test implements java.util.Observer {

	public void update( final Observable obs, final Object arg) {
	}

}
Das ist legaler Code; trotz final wird das Interface implementiert.

Relativ sinnlos ist es trotzdem
:wink:
 
G

Guest

Gast
Hallo,

deathbyaclown hat gesagt.:
wieso erstellst du nicht einfach ein Immutable Objekt als Parameter für den Update ?
Die Klasse habe fertig bekommen und kann nicht als final deklarieren. Die Objekte bekomme ich auch als Rückgabewert einer fetigen Methode.

meinst du etwa so?
Code:
final KlasseX objektX = dieMethode();
notifyObservers(objektX);
oder so?
Code:
final KlasseX objektX = new KlasseX(dieMethode());
notifyObservers(objektX);


SnooP hat gesagt.:
Andererseits wäre ich nie auf die Idee gekommen das Datenobjekt im Observer zu verändern.. schließlich soll da ja nur die Ausgabe stattfinden.
Ich wäre auch nicht auf die Idee kommen, das Datenobjekt zu verändern, und deshalb möchte verhindern, dass irgenjemand irrtümlich auf diese Idee kommt.


Murray hat gesagt.:
Das geht so nicht (keine korrekte Syntax).
final kannst Du Du nur in der Deklaration einer Methode verwenden, und auch da hat es nicht die Bedeutung, die Du brauchst: final bedeutet nur, dass man die Variable nicht erneut zuweisen kann; das Object, auf das die Variable zeigt, kann sehr wohl geändert werden.
Code:
public void doThis( final MyObject param) { 

  param.setSomeValue( null); //---erlaubt 
  param = null; //--- nicht erlaubt 
}
Dann das heißt, dass auch dieser Code wird nicht helfen, damit man den Inhalt eines Objekts schreibgeschützt machen?
Murray hat gesagt.:
Das stimmt m.E. nicht:
Code:
import java.util.Observable; 

public class Test implements java.util.Observer { 

   public void update( final Observable obs, final Object arg) { 
   } 

}
 
B

bygones

Gast
wie schon gesagt, eine Klasse final zu machen bzw. einfach ein final vor die Variable zu schreiben schützt dich nicht vor Änderungen.

Zum Thema Immutable -> siehe FAQs Design Patterns.


Aber wenn du die Klasse an sich schon fertig bekommst und sie nicht ändern kannst, so hilft dir alles nichts. wenn diese klasse so implementiert ist, dass man änderungen an ihr vornehmen kann - könnte höchstens eine Art immutable Wrapper Klasse dir weiter helfen... dass du sozusagen eine neue (immutable) Klasse schaffst, die das eigentliche Objekt beinhaltet....
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Implementierung des Observer/Observable Patterns - Gut so? Java Basics - Anfänger-Themen 3
H [erledigt] Observable/Observer Beobachter entfernen Java Basics - Anfänger-Themen 2
G Unterschied Observer&Observable<->java.beans.Prope Java Basics - Anfänger-Themen 4
K Observer Observable update() . Java Basics - Anfänger-Themen 13
G Observable/Observer update wird nicht ausgeführt Java Basics - Anfänger-Themen 9
L Vererbung Multivererbung und Observable Java Basics - Anfänger-Themen 4
L Obersver - Observable, Bomberman Java Basics - Anfänger-Themen 11
E Interface extends Observable Java Basics - Anfänger-Themen 13
J Methoden Observer-Pattern mit Consumer und accept( ) Java Basics - Anfänger-Themen 6
J Implementierung von Observer und Singleton-Pattern Java Basics - Anfänger-Themen 9
fLooojava MVC Pattern und Observer Pattern Java Basics - Anfänger-Themen 6
Y Observer update Java Basics - Anfänger-Themen 3
N Observer funktioniert nicht Java Basics - Anfänger-Themen 13
G Observer löst zweimal aus Java Basics - Anfänger-Themen 8
A ein observer "post"problem Java Basics - Anfänger-Themen 3
A Observer Pattern Problem Java Basics - Anfänger-Themen 15
J Interface Frage zu Interfces am Beispiel Observer Pattern Java Basics - Anfänger-Themen 8
F Observer Java Basics - Anfänger-Themen 7
U observer thread safe Java Basics - Anfänger-Themen 4
Helgon Observer Pattern - hasChanged() immer false Java Basics - Anfänger-Themen 10
B Wozu Observer? Java Basics - Anfänger-Themen 9
Spin Observer Patteern java Java Basics - Anfänger-Themen 7
O Liste - Observer/Observeable - HashMap Hilfe Java Basics - Anfänger-Themen 19
C OOP Observer Pattern Java Basics - Anfänger-Themen 2
O Observer - Einfach erklärt? Java Basics - Anfänger-Themen 5
K Observer Pattern notifyObservers Java Basics - Anfänger-Themen 9
P Fragen zum Observer Muster und Datenbanken Java Basics - Anfänger-Themen 2
T Observer ansprechen Java Basics - Anfänger-Themen 2
R Observer funktioniert nicht. Sehe keine Fehler Java Basics - Anfänger-Themen 2
W Observer-Pattern Java Basics - Anfänger-Themen 3
hdi JList mit Model und Observer -> Chaos, blicke nicht durch Java Basics - Anfänger-Themen 22
hdi Observer als statische Klasse ? Java Basics - Anfänger-Themen 2
N observer frage Java Basics - Anfänger-Themen 2
N observer Java Basics - Anfänger-Themen 12
G Benötige Hilfe bei Problem mit Observer! Java Basics - Anfänger-Themen 2
E Observer Java Basics - Anfänger-Themen 7
T Verständnisfrage Observer-Pattern Java Basics - Anfänger-Themen 8
Y Observer - notifyObservers(Object arg) Java Basics - Anfänger-Themen 4
M Servlets und Observer Java Basics - Anfänger-Themen 2
S Observer Pattern notifyObserver Java Basics - Anfänger-Themen 6
M Observer Pattern Java Basics - Anfänger-Themen 14
A MVC Observer Pattern Java Basics - Anfänger-Themen 2
J Design Patterns Java Basics - Anfänger-Themen 8
N Was bedeutet "Implementierung vor dem Client verbergen" bei Design Patterns? Java Basics - Anfänger-Themen 2
I Desing Patterns / Factory Java Basics - Anfänger-Themen 4
S Singleton (Design Patterns) Java Basics - Anfänger-Themen 16
T Wie wichtig ist Design Patterns in einer Firma? Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben