2012-07-26 101 views
1

Controller類是一個單例,它似乎是一個特殊情況,允許將this安全地傳遞給Controller在構造函數中泄漏這個

的Netbeans給

配置這讓我向更好的技術會是什麼暗示

controller.addObserver(this);「的構造函數傳遞參數可疑」,雖然我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"); 
    } 

回答

6

你傳入this到外部類(Controller)時,對象還沒有被完全構造。 Controller然後可以引用你的對象,而其構造尚未完成。

大多數人通過使用工廠方法來解決此問題,該方法首先創建對象,然後從外部傳遞this

// 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; 
} 

看看this excellent Brian Goetz article安全物體的建設。

1

以此爲參數可以在構造器危險的,因爲該對象未完全初始化

由於從http://wiki.netbeans.org/Java_Hints

我猜的一點是,超類可以嘗試訪問開尚未初始化的班級(或者您以後在自己的施工期間更改)

相關問題