Effektives Java?



  • Ich hab mal 2 Frage bezgl. Java, die mir auf dem Herzen liegen. 🙂

    Nummer 1:

    Die Betrifft die Thread-Sicherheit. Ich habe eine Klasse von der nur eine Instanz existiert und die eine Methode call() hat, welche threadsafe ist(kommt von einem Dritten). Wenn ich nun diese Methode überschreibe und selbst eine weitere Methode fooBar() aufrufe, ist diese dannn auch automatisch threadsafe?

    public class OnlyOneInstance{
    
        public void call(){
           //Ich werde von einer anderen Klassen aufgerufen,
           //und kann von vielen Threads zu gleichen Zeit aufgerufen werden.
    
           fooBar();
        }
    
        public void fooBar(){
            //Wenn ich direkt aus call() aufgerufen werde, bin ich
            //dann automatisch auch threadsafe?
        }
    }
    

    Nummer 2a:

    Was kostet ein try/catch Block, wenn keine Exception geworfen werden? Gibt es dort gravierende unterschiede wo ich Exceptions fange? Am angenehmsten ist es teilweise direkt im View Exceptions erst zu fangen, da ich sie dort je nach Bedarf ausgeben kann oder nicht. Aber die Exception wird vorher teilweise über 5-10 Klassen weitergeleitet mittels throws Exception. Also durch die Controller und Model Komponenten.

    Nummer 2b:

    Macht das einen Performanceunterschied ob ich Exceptions mit der Basisklasse Exception fange, auch wenn ich weiß das es zum nur FileNotFoundException und IOException sein können? Oder ist das egal?

    Vielen Dank schon mal für die Antworten! 🙂



  • Javamanie schrieb:

    Nummer 2b:

    Macht das einen Performanceunterschied ob ich Exceptions mit der Basisklasse Exception fange, auch wenn ich weiß das es zum nur FileNotFoundException und IOException sein können? Oder ist das egal?

    Allgemeine "Exceptions" solltest du aus Designgründen nie fangen, sondern immer die speziellen. Wenn du eine allgemeine Exception fängst, dann kann dir nämlich so ziemlich alles mögliche ins Netz gehen. Zum Beispiel eine ArrayIndexOutOfBoundsException, mit der du eigentlich nicht gerechnet hast. Das wäre dann ein Programmierfehler, der sich genauso wie ein zur Laufzeit auftretender Fehler der Umgebung äußert. Im Zweifelsfall kann soetwas relativ schwer zu debuggen sein oder sogar vorläufig gar nicht auffallen. Kurz gesagt: Das ist schlecht und man sollte es nicht machen.



  • Danke!

    Weiß noch wer etwas zu den anderen Problemen?



  • Wie ich aus deinen Quellcode heraus sehen kann ist alles threadsafe, ist da es keinerlei Race Conditions gibt ;-).
    call() ist nicht synchronisiert also wird bei eintritt kein monitor für das objekt erzeugt.
    Um wirklich sicher zu gehen das nur eine Instanz deiner Klasse existiert solltest du sie als Singleton implementieren.

    Cu



  • Zu 2a: Ein try-catch-Block kostet überhaupt nix.



  • hallo,
    ich möchte dir nur auf ein interessantes buch in das Thema hinweisen
    "Effektiv JAVA programmieren" falls du das nicht kennst. das Buch beschäftgt sich mit Performance, Effektivität und ...(insgesamt 57 Regeln)
    Autor:JOSHUA BLOCH
    verlag: ADDISON-WESLEY


Anmelden zum Antworten