2014-01-10

Leaking this in constructor

Manche Dinge lassen sich sehr schnell beheben. Träge, wie man nun mal ist, schiebt man scheinbare Kleinigkeiten aber oft zu lange vor sich her. Hier also ein Appell an das schnellere Beseitigen von Unzulänglichkeiten.
Im Quelltext von Notes and Tasks finden sich diverse Stellen, an denen in NetBeans ein Leaking this in constructor moniert wird. Hier ein Beispiel:
 public class TasksView extends BasePanel implements ActionListener,  
     ListSelectionListener, ListDataListener {  
   
    [...]  
   
   public TasksView(ListModel modelTasks) {  
     super(Constants.LARGE_GAP, Constants.LARGE_GAP);  
     // create actions  
     actionChangeCategory = ActionUtilities.createAction(  
         ACTION_CHANGE_CATEGORY, this);  
     actionChangeState = ActionUtilities.createAction(ACTION_CHANGE_STATE,  
         this);  
     actionDelete = ActionUtilities.createAction(ACTION_DELETE, this);  
   
    [...]  
Die Warnung erfolgt beim Aufruf meiner Methode ActionUtilities.createAction(). Sie sieht folgendermaßen aus:
      public static Action createAction(String actionName,  
                final ActionListener listener) {  
Das this beim Aufruf bezieht sich auf den zweiten Parameter, die Referenz auf einen ActionListener. Die aufrufende Klasse implementiert dieses Interface. Soweit doch alles in Ordnung, oder?
Die Warnung erscheint, weil der Methodenaufruf aus dem Konstruktor heraus erfolgt. Möglicherweise ist das Objekt zu diesem Zeitpunkt noch nicht vollständig initialisiert. Das kann die aufgerufene Methode allerdings nicht wissen. Es besteht also die Gefahr, dass sie auf unvollständigen Daten operiert. Oft sind Nullpointer die Folge. Wie man das Problem löst, ist situationsabhängig. Ignorieren ist aber keine gute Idee.
Zwinkerndes Smiley
Im konkreten Fall weiß ich, dass die Methode createAction() die Referenz nur für den späteren Gebrauch speichert. Deshalb kann ich sicher auf ActionListener casten und somit die Warnung verschwinden lassen. Das ist aber nicht immer ein geeignetes Mittel.
Fazit: Warnungen erscheinen aus einem bestimmten Grund. Sie möchten den Entwickler daran erinnern, genau zu prüfen, ob das, was er geschrieben hat, auch wirklich das ist, was er möchte.
Hatten Sie diese Warnung schon? Wie sind Sie damit umgegangen? Schreiben Sie mir…

No comments:

Post a Comment