fehlende Mehrfachvererbung logging.Handler impl. Observable

Status
Nicht offen für weitere Antworten.
P

Puste

Gast
Hallo allerseits.

Stehe vor folgendem Problem,
ich implementiere einen logging.Handler, an welchem sich Observer anmelden können müssen.
Jedoch weder logging.Handler, noch Observable bietet mir ein Interface, um die fehlende Mehrfachvererbung zu umgehen. Einfach ausgedrückt, zwei Mutterklassen, Handler und Observable, wie vereine ich diese.


Meine beiden Ansätze bisher:

Variante A:
Man implementiert die Methoden der Klasse Observable in der eigenen Handler Klasse.
Dummerweise scheitert es dann an:
Code:
void notifyObservers(Object obj) {
		for (Observer o : observers) {
			o.update(this, obj);
		}
	}
Ich kann die eigene Handlerinstanz nicht an die Observer weiterreichen, weil sie nicht vom Typ Observable ist.

Variante B:
Ich erzeuge ein Feld Observable in meiner Handler Klasse auf welches ich dann von außen zugreifen kann.
Auch hier scheitert es dann an der setChanged() Methode des Observers, ... protected, ich kann von meiner Handler Klasse nicht auf drauf zugreifen.


Eine eigene implementation des Observer Patterns würde ich gerne erstmal umgehen, existieren zu solch einer Design-Problematik schon Lösungsansätze? Irgendwie habe ich bisher zu wenig mit den java eigenen Observern gearbeitet.
 
S

Spacerat

Gast
Was soll das an sich werden? Soll der Handler etwa gleichzeitig Observer und Oservable sein? Dann müssen auch beide "Interfaces" implementiert werden. Z.B. Kann man dem innerhalb des Handlers Observable anonym implementieren und dessen Methoden in die Handlerklasse einbauen. Ich glaube das Pattern dazu heist "Method-Delegate".

mfg Spacerat
 
P

Puste

Gast
"Was soll das an sich werden?"

Folgendes wäre optimal:
Code:
public class MyHandler extends java.util.logging.Handler implements java.util.Observable
funktioniert nur leider nicht, da Observable eine Klasse ist.


Das Delegate Pattern würde auf das gleiche Problem wie Variante A hinauslaufen. Ich habe in meiner Klasse zwar alle Methoden von Observable, bin aber nicht im stande ein update(this, obj); aufzurufen, weil this nicht vom Typ Observable ist.
Ebenso würde Delegate auch das Problem aus Variante B hervorbringen, ich kann nicht auf die setChanged() und clearChanged() Methoden der Observable Instanz zugreifen, weil diese nicht public sind.
 
S

Spacerat

Gast
Gut... Misverständnis... "Interface" stand ja auch in Anführungszeichen da.
Ich meine das so...
Code:
import java.util.Observable;
import java.util.Observer;
import java.util.logging.Handler;
import java.util.logging.LogRecord;

public class TestHandler
extends Handler
implements Observer
{
    private final MyObservable obs = new MyObservable();

    public void close() throws SecurityException
    {
    }

    public void flush()
    {
    }

    public void publish(LogRecord record)
    {
    }

    public void update(Object arg)
    {
        update(obs, arg);
    }

    public void update(Observable o, Object arg)
    {
        // Variante B:
    }

    public void addObserver(Observer o)
    {
        obs.addObserver(o);
    }

    public void clearChanged()
    {
        obs.clearChanged();
    }

    public int countObservers()
    {
        return obs.countObservers();
    }

    public void deleteObserver(Observer o)
    {
        obs.deleteObserver(o);
    }

    public void deleteObservers()
    {
        obs.deleteObservers();
    }

    public boolean hasChanged()
    {
        return obs.hasChanged();
    }

    public void notifyObservers(Object o)
    {
        obs.notifyObservers(o);
    }

    public void notifyObservers()
    {
        obs.notifyObservers();
    }

    public void setChanged()
    {
        obs.setChanged();
    }

    private static final class MyObservable
    extends Observable
    {
        public synchronized void clearChanged()
        {
            super.clearChanged();
        }

        public synchronized void setChanged()
        {
            super.setChanged();
        }
    }
}
Leider habe ich keinen Code für deine Variante B. Der Wermutstropfen der bleibt, ist, dass die geforderte Methode "update(Observable obs, Object obj)" relativ überflüssig ist, da das verwendete Observable ja nach aussen hin nicht sichtbar ist.

mfg Spacerat
 
P

Puste

Gast
Ja, an einem ähnlichen Punkt war ich auch, nur das es langsam Sinn ergibt.

Bin jetzt bei diesem code angelangt:

Code:
public class RingBufferHandler2 extends Handler {
	private RingBuffer<LogRecord> buffer;
	private ObservableImpl observable = new ObservableImpl();
	
            [...]

	@Override
	public void publish(LogRecord record) {
		if (!isLoggable(record))
			return;

		synchronized(this) {
			buffer.push(record);
			observable.setChanged();
			observable.notifyObservers(record);
			observable.clearChanged();
		}
	}
	
	public Observable getObservable() {
		return observable;
	}
	
	private final class ObservableImpl extends Observable {

		public void setChanged() {
			super.setChanged();
		}
		
		public void clearChanged() {
			super.clearChanged();
		}
		
	}
}

Sieht ja garnicht schlecht aus, könnte man sogar ein Interface für machen :autsch:
Irgendaws stört mich noch daran, aber zumindest spare ich mir 3 Klassen in der Lib.

Dank Dir :)
 
S

Spacerat

Gast
Was störend sein könnte, ist die Tatsache das deine "ObservableImpl" nicht statisch ist. Für meine Lösung hatte ich noch im Sinn "obs" ebenfalls statisch zu machen. Dann gibt es nur ein "Observable" in welchem alle Handler registriert werden.

mfg Spacerat
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Methoden Methoden anpassen und fehlende Funktionen hinzufügen Allgemeine Java-Themen 475
M DYGraphen darstellen... fehlende Einstellungen Allgemeine Java-Themen 1
M Fehlende Zeichen beim Drucken mit PDFBox Allgemeine Java-Themen 10
K JFreeCharts - Dummy für fehlende Daten Allgemeine Java-Themen 6
L Fehlende Teile des javax Packages Allgemeine Java-Themen 3
Sachinbhatt Wie wird die Typumwandlung bei Mehrfachvererbung in Java implementiert? Allgemeine Java-Themen 3
D Vererbung Mehrfachvererbung Allgemeine Java-Themen 7
D Warum keine Mehrfachvererbung? Allgemeine Java-Themen 5
G Was nutzen statt Mehrfachvererbung? Allgemeine Java-Themen 7
F Design Pattern zur Realisierung von Mehrfachvererbung? Allgemeine Java-Themen 8
C Mehrfachvererbung Allgemeine Java-Themen 4
8u3631984 Strukturiertes Logging : Jedes Feld in eine seperate Zeile - aber wie ? Allgemeine Java-Themen 2
T Logging mit org.apache.logging.log4j Allgemeine Java-Themen 1
MiMa Logging mit log4j2 in verschiedene Dateien? Allgemeine Java-Themen 22
S Input/Output Jave.utill.logging ohne Default-Locale also in Englisch Allgemeine Java-Themen 3
A Automatisches Methoden Laufzeiten logging? Allgemeine Java-Themen 7
M JVM: Client Software Logging und Profiling aktivieren Allgemeine Java-Themen 1
AssELAss Log4j Logging Ausgabe für jede Klasse in seperates File Allgemeine Java-Themen 2
P Logging levels Allgemeine Java-Themen 2
X Logging Messages - mehr Details? Allgemeine Java-Themen 4
F Error Logging - best practices? Allgemeine Java-Themen 3
L util.logging Log Rotation Allgemeine Java-Themen 3
W Java Logging Problem Allgemeine Java-Themen 3
H java.util.logging Formatter Optionen setzen Allgemeine Java-Themen 2
D Logging XMLFormatter Allgemeine Java-Themen 3
B OOP java.util.logging.Logger: Wie kann ich mehre Klassen in ein Logfile schreiben lassen? Allgemeine Java-Themen 12
D Technologiefragen, logging, JMX Allgemeine Java-Themen 3
S Tomcat java.util.logging - keine Logs Allgemeine Java-Themen 12
J Logging mehrerer Methoden Allgemeine Java-Themen 21
S log4j - doppeltes Logging Allgemeine Java-Themen 4
B Logging von Exceptions Allgemeine Java-Themen 7
S log4j Logging über mehrere Klassen Allgemeine Java-Themen 13
P SLF4J Logging Level einstellen Allgemeine Java-Themen 2
DamienX Google Guice AOP + Logging Allgemeine Java-Themen 3
T CP Problem: Webstart + Logging properties file + eigener Handler Allgemeine Java-Themen 7
A java logging api scheint nicht thread save zu sein Allgemeine Java-Themen 22
T Java Logging API in Multi Threaded API Allgemeine Java-Themen 2
M Verbieten Applets die Nutzung von Commons Logging? Allgemeine Java-Themen 7
F Java logging Allgemeine Java-Themen 4
F Java logging Leerzeile als Standardeinstellung Allgemeine Java-Themen 4
S Java logging konfigurieren? Allgemeine Java-Themen 5
DEvent log4j, commons logging, log4j.properties and co Allgemeine Java-Themen 12
J Logging Allgemeine Java-Themen 10
J Log4j / commons-logging Allgemeine Java-Themen 3
K Logging mit Log4j Allgemeine Java-Themen 2
G Logging Allgemeine Java-Themen 4
S Logging mit log4j Allgemeine Java-Themen 17
S Logging Allgemeine Java-Themen 9
M Rat gesucht: Logging (log4J oder java.util.logging oder .) Allgemeine Java-Themen 5
T Logging Allgemeine Java-Themen 12
T Transaction Logging Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben