tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
6
ZUGRIFFE
722
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    ibo2010 ibo2010 ist offline Rookie
    Registriert seit
    Apr 2010
    Beiträge
    5
    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.
     

  2. #2
    SPiKEe Tutorials.de Gastzugang
    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
     

  3. #3
    Avatar von Akeshihiro
    Akeshihiro Akeshihiro ist offline Mitglied Platin
    Registriert seit
    Aug 2008
    Ort
    Kirchlengern (NRW)
    Beiträge
    647
    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:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    
    // 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();
        }
    }
     
    Man sagt, das Schwert eines Samurai sei seine Seele ...

    Mit den Beiträgen ist es wie mit Schwertern: Je besser die Rohstoffe sind und je öfter man diese bearbeitet, desto hochwertiger sind sie.

    Das Schmieden ist eine Kunst; Das Schreiben auch ;)

  4. #4
    ibo2010 ibo2010 ist offline Rookie
    Registriert seit
    Apr 2010
    Beiträge
    5
    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.
     

  5. #5
    Avatar von zeja
    zeja zeja ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Sep 2006
    Beiträge
    2.962
    Wobei sich wieder die Frage stellt: Warum ein eigenes Logging implementieren, wenn es sie wie Sand am Meer gibt?
     

  6. #6
    ibo2010 ibo2010 ist offline Rookie
    Registriert seit
    Apr 2010
    Beiträge
    5
    Zitat Zitat von zeja Beitrag anzeigen
    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!
     

  7. #7
    Avatar von zeja
    zeja zeja ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Sep 2006
    Beiträge
    2.962
    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.
     

Ähnliche Themen

  1. C++ Referenz in Klasse initialisieren
    Von Sephizero im Forum C/C++
    Antworten: 3
    Letzter Beitrag: 18.06.09, 20:16
  2. Objekte initialisieren
    Von starbuck86 im Forum Java Grundlagen
    Antworten: 3
    Letzter Beitrag: 21.10.08, 17:15
  3. Konvertierung der selben Klasse in unterschiedlichen Namespaces
    Von realbora im Forum .NET Web und Kommunikation
    Antworten: 13
    Letzter Beitrag: 12.12.07, 15:47
  4. Antworten: 2
    Letzter Beitrag: 25.11.04, 15:46
  5. Antworten: 4
    Letzter Beitrag: 17.09.04, 17:52

Stichworte