Klasse mit unterschiedlichen Klassenparametern initialisieren

ibo2010

Grünschnabel
Hallo zusammen ,
ich stehe hier ein wenig auf dem Schlauch.

Ich habe eine Klasse LogScreen die mit einer jTextArea initialisiert wird und
zwei Methoden wie

void info(String text)....
void error (String text)....

enthält und in einer GUI LogMeldungen in eine TextArea schreibt.

Desweiteren gibt es da noch eine Klasse LogFile die enthält auch Methoden
wie info ... usw. halt einiges mehr um ein Logfile zu erzeugen ....

Ich möchte nun in der Klasse ClientWorker einen Konstruktor haben, der einmal, wenn er von der
GUI aufgerufen wird z.B.
ClientWorker c = new ClientWorker(LogScreen log);
oder vom Kommandozeilentool
ClientWorker c = new ClientWorker(LogFile log);
Wie mache ich sowas ?
In der Klasse ClientWorker geben alle Methoden per log.info("Text....");
die Meldungen aus.
Ist bestimmt ganz einfach, ich habe aber ebend keine Idee.
Danke schon mal sagt Ibo.
 
ich würde das nicht direkt mit überladenen konstruktoren machen da du so unweigerich code duplizierst ...
als konstruktor würde ich einen NULL-konstruktor *keinen übergabe- und rückgabe wert* vorschlagen ...
dann eine methode *public / protected .. je nach dem* welche halt Log an sich implementiert *ich gehe davon aus das LogScreen und LogFile ein gemeinsames super Log oder sowas haben* und dann entweder mit instanceOf *geht das so überhaupt ?* oder einen 2ten übergabe-parameter *bool bietet sich bei >2< varianten an ... ansonsten char um RAM zu schonen* und dann in der implementierung auf diesen an den kritisch stellen prüfen
ansonsten hätte ich so spontan keine andere idee ^^
 
Was dir fehlt ist eine gemeinsame Schnittstelle der Logger. Wenn du eine gemeinsame Schnittstelle hast, ist das schon gar kein Problem mehr. Dann brauchst du nur noch einen Konstruktor in der ClientWorker-Klasse, der eine Implementierung der Schnittstelle als Parameter erwartet.

Hab mal flott ein Beispiel zusammgezimmert. Es fehlen zwar die imports, aber soll auch nur ein Beispiel sein:
Java:
// Log.java
public interface Log {
	public void info(String info);
	public void error(String error);
}

// LogScreen.java
public class LogScreen implements Log {
	private JTextComponent tc;
	
	public LogScreen(JTextComponent tc) {
		this.tc = tc;
	}

	public void info(String info) {
		// In eine TextArea oder was auch immer schreiben
	}
	
	public void error(String error) {
		// In eine TextArea oder was auch immer schreiben
	}
}

// LogFile.java
public class LogFile implements Log {
	private File logFile;
	
	public LogFile(File logFile) {
		this.logFile = logFile;
	}

	public void info(String info) {
		// In eine Datei schreiben
	}
	
	public void error(String error) {
		// In eine Datei schreiben
	}
}

// ClientWorker.java
public class ClientWorker {
	private Log log;

	public ClientWorker(Log log) {
		this.log = log;
	}
	
	public void tuWas() {
		log.info("Es wird was getan");
		
		// Etwas tun
		// ...
		
		// Fehler aufgetreten
		info.error("Es ist beim etwas tun ein Fehler aufgetreten!");
	}
}

// CMD.java
public class CMD {
	public static void main(String[] args) {
		ClientWorker cw = new ClientWorker(new LogFile(new File("/var/log/meineLogFile.log")));
		
		cw.tuWas();
	}
}

// GUI.java
public class GUI extends JFrame {
	private ClientWorker cw;

	private JTextArea logTextArea;
	private JButton tuWasButton;
	
	private JTextArea getLogTextArea() {
		if(logTextArea == null) {
			logTextArea = new JTextArea();
		}
		
		return logTextArea;
	}
	
	private JButton getTuWasButton() {
		if(tuWasButton == null) {
			tuWasButton = new JButton("tu was");
			tuWasButton.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					cw.tuWas();
				}
			});
		}
		
		return tuWasButton;
	}

	public GUI() {
		cw = new ClientWorker(new LogScreen(getLogTextArea()));
		
		// Komponenten hinzufügen etc.
		// ...
	}

	public static void main(String[] args) {
		new GUI();
	}
}
 
Hallo ,
danke für die Antworten !
Nach einigem hin und her, habe ich mich entschlossen, die Logging KLasse dahingehend
zu erweitern, das auch auf einer TextArea die Meldungen ausgegeben werden können und
bei der Initialisierung ein Flag gesetzt wird, das nicht in ein File geschrieben wird.
Hat letztlich sogar den Vorteil, das man nun für die GUI ein "normales" Logging hat und trotzdem
ein Logfile für Traces erzeugen kann und nur noch eine Klasse benötigt wird.
Danke nochmals und ein frohes Osterfest, wünscht Ibo.
 
Wobei sich wieder die Frage stellt: Warum ein eigenes Logging implementieren, wenn es sie wie Sand am Meer gibt?
 
Wobei sich wieder die Frage stellt: Warum ein eigenes Logging implementieren, wenn es sie wie Sand am Meer gibt?
Hi Zeja,

stimmt schon, aber :
1. Sollte das Logfile von der Optik so aussehen, wie die bisherigen auch ,die von Perl-Scripten erstellt werden , damit da der Anwender nicht umstellen muss.
und
2. wollte ich halt auch direkt das Ganze am Screen ausgeben können.
Wirklich aufwendig, ist das Logging ja auch nicht.
Gruss Ibo!
 
Die Logging APIs lassen dich das aussehen der Logfiles konfigurieren. Mit einem eigenen Appender kannst du auch auf die GUI loggen.

Logging ist sicherlich zunächst nicht schwierig. Bis die Anforderungen zunehmen und man hier und da noch was dazubaut und es immer komplexer wird. Schau dir doch lieber mal eins der Frameworks an. Das Rad neu erfinden ist gerade als Entwickler selten eine gute Idee.
 
Zurück