2012-07-26 3 views
1

La classe Controller est un singleton, ce qui semble être un cas particulier permettant de passer en toute sécurité this à Controller.Fuite dans le constructeur

Netbeans donne

Configurer "passer des paramètres suspects dans le constructeur" soupçon

pour controller.addObserver(this); qui me fait demander ce que la meilleure technique serait, bien que je gather it's not a good approach.

package net.bounceme.dur.usenet.swing; 

import java.util.Observable; 
import java.util.Observer; 
import java.util.logging.Logger; 
import javax.mail.Folder; 
import javax.swing.ListModel; 
import net.bounceme.dur.usenet.controller.Controller; 
import net.bounceme.dur.usenet.controller.MessageBean; 
import net.bounceme.dur.usenet.controller.MessagesDefaultListModel; 

public class MessageSelect extends javax.swing.JPanel implements Observer { 

    private static final Logger LOG = Logger.getLogger(MessageSelect.class.getName()); 
    private Controller controller = Controller.getInstance(); 
    private ListModel messages = new MessagesDefaultListModel(); 
    private MessageBean messageBean = new MessageBean(); 

    @SuppressWarnings("unchecked") 
    public MessageSelect() { 
     controller.addObserver(this); 
     initComponents(); 
     messagesJList.setPrototypeCellValue("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"); 
    } 

Répondre

6

Vous passez this à une classe externe (Controller) lorsque l'objet n'a pas été entièrement construit. Controller pourrait alors référencer votre objet alors que sa construction n'est pas terminée.

La plupart des gens travaillent autour de ce en utilisant une méthode de fabrication qui crée d'abord l'objet, puis passe this externe.

// private to force clients to use the static factory method 
private MessageSelect() { 
    initComponents(); 
    messagesJList.setPrototypeCellValue("xxx"); 
} 

public static MessageSelect createInstance() { 
    MessageSelect instance = new MessageSelect(); 
    instance.controller.addObserver(instance); 
    return instance; 
} 

Jetez un coup d'œil à this excellent Brian Goetz article sur la construction d'objets sécurisés.

1

utilisant comme paramètre peut être dangereux dans le contructor parce que l'objet n'est pas complètement initialisé

A partir http://wiki.netbeans.org/Java_Hints

Je suppose que le point est, la super classe peut essayer de l'accès à part de la classe qui n'a pas encore été réactiver les (ou vous changez plus tard au cours de votre propre construction)