2015-01-16 2 views
0

Я использую шаблон singleton для создания класса, однако он получает еще один синглтон в качестве параметра, он не работает, действительно ли это возможно?Singleton, идущий в бесконечный цикл

Это весь проект: https://github.com/raphaelbgr/SwingSocketClient/tree/master/src

package clientmain; 

import gui.janelas.JanelaMain; 

public class ClientMain { 

    public static int port    = 0; 

    public static Thread receiver   = null; 

    public static String ip     = null;  
    public static String your_name  = null;  

    public static void main(String[] args) {  
     JanelaMain jam = JanelaMain.getInstance(); //JanelaMain extends JFrame 
     jam.setLocationByPlatform(false); 
    } 

Это это синглтон блок.

//SINGLETON PATTERN BLOCK 
private static JanelaMain jam; 
public static JanelaMain getInstance() { 
    if (JanelaMain.jam == null) { 
     jam = new JanelaMain(JanelaSelectServer.getInstance()); //Another one passed by parameter 
    } 
    return jam; 
} 

Другой класс Singleton блок:

//SINGLETON PATTERN BLOCK 
private JanelaSelectServer() {} //JanelaSelectServer extends another JFrame 
private static JanelaSelectServer jsv; 
public static JanelaSelectServer getInstance() { 
    if (jsv == null) { 
     jsv = new JanelaSelectServer(); 
    } 
    return jsv; 
} 

Дерьмо случается (A Loop)

s.JanelaMain.<init>(JanelaMain.java:37) 
at gui.janelas.JanelaMain.getInstance(JanelaMain.java:144) 
at gui.updatelogs.ConnectionLog.<init>(ConnectionLog.java:13) 
at gui.updatelogs.ConnectionLog.getInstance(ConnectionLog.java:34) 
at gui.janelas.JanelaMain.<init>(JanelaMain.java:37) 
at gui.janelas.JanelaMain.getInstance(JanelaMain.java:144) 
at gui.updatelogs.ConnectionLog.<init>(ConnectionLog.java:13) 
at gui.updatelogs.ConnectionLog.getInstance(ConnectionLog.java:34) 
at gui.janelas.JanelaMain.<init>(JanelaMain.java:37) 
at gui.janelas.JanelaMain.getInstance(JanelaMain.java:144) 
at gui.updatelogs.ConnectionLog.<init>(ConnectionLog.java:13) 
at gui.updatelogs.ConnectionLog.getInstance(ConnectionLog.java:34) 
at gui.janelas.JanelaMain.<init>(JanelaMain.java:37) 
at gui.janelas.JanelaMain.getInstance(JanelaMain.java:144) 
at gui.updatelogs.ConnectionLog.<init>(ConnectionLog.java:13) 
at gui.updatelogs.ConnectionLog.getInstance(ConnectionLog.java:34) 
at gui.janelas.JanelaMain.<init>(JanelaMain.java:37) 
at gui.janelas.JanelaMain.getInstance(JanelaMain.java:144) 
at gui.updatelogs.ConnectionLog.<init>(ConnectionLog.java:13) 
at gui.updatelogs.ConnectionLog.getInstance(ConnectionLog.java:34) 
at gui.janelas.JanelaMain.<init>(JanelaMain.java:37) 
at gui.janelas.JanelaMain.getInstance(JanelaMain.java:144) 
at gui.updatelogs.ConnectionLog.<init>(ConnectionLog.java:13) 
at gui.updatelogs.ConnectionLog.getInstance(ConnectionLog.java:34) 
at gui.janelas.JanelaMain.<init>(JanelaMain.java:37) 
at gui.janelas.JanelaMain.getInstance(JanelaMain.java:144) 
at gui.updatelogs.ConnectionLog.<init>(ConnectionLog.java:13) 
at gui.updatelogs.ConnectionLog.getInstance(ConnectionLog.java:34) 
at gui.janelas.JanelaMain.<init>(JanelaMain.java:37) 
at gui.janelas.JanelaMain.getInstance(JanelaMain.java:144) 
at gui.updatelogs.ConnectionLog.<init>(ConnectionLog.java:13) 
at gui.updatelogs.ConnectionLog.getInstance(ConnectionLog.java:34) 
at gui.janelas.JanelaMain.<init>(JanelaMain.java:37) 
at gui.janelas.JanelaMain.getInstance(JanelaMain.java:144) 
at gui.updatelogs.ConnectionLog.<init>(ConnectionLog.java:13) 
at gui.updatelogs.ConnectionLog.getInstance(ConnectionLog.java:34) 
at gui.janelas.JanelaMain.<init>(JanelaMain.java:37) 
at gui.janelas.JanelaMain.getInstance(JanelaMain.java:144) 
at gui.updatelogs.ConnectionLog.<init>(ConnectionLog.java:13) 
at gui.updatelogs.ConnectionLog.getInstance(ConnectionLog.java:34) 
at gui.janelas.JanelaMain.<init>(JanelaMain.java:37) 
at gui.janelas.JanelaMain.getInstance(JanelaMain.java:144) 
at gui.updatelogs.ConnectionLog.<init>(ConnectionLog.java:13) 
at gui.updatelogs.ConnectionLog.getInstance(ConnectionLog.java:34) 
at gui.janelas.JanelaMain.<init>(JanelaMain.java:37) 
at gui.janelas.JanelaMain.getInstance(JanelaMain.java:144) 
at gui.updatelogs.ConnectionLog.<init>(ConnectionLog.java:13) 
at gui.updatelogs.ConnectionLog.getInstance(ConnectionLog.java:34) 
at gui.janelas.JanelaMain.<init>(JanelaMain.java:37) 
at gui.janelas.JanelaMain.getInstance(JanelaMain.java:144) 
at gui.updatelogs.ConnectionLog.<init>(ConnectionLog.java:13) 
at gui.updatelogs.ConnectionLog.getInstance(ConnectionLog.java:34) 
at gui.janelas.JanelaMain.<init>(JanelaMain.java:37) 
at gui.janelas.JanelaMain.getInstance(JanelaMain.java:144) 
at gui.updatelogs.ConnectionLog.<init>(ConnectionLog.java:13) 
at gui.updatelogs.ConnectionLog.getInstance(ConnectionLog.java:34) 
at gui.janelas.JanelaMain.<init>(JanelaMain.java:37) 
at gui.janelas.JanelaMain.getInstance(JanelaMain.java:144) 
at gui.updatelogs.ConnectionLog.<init>(ConnectionLog.java:13) 
at gui.updatelogs.ConnectionLog.getInstance(ConnectionLog.java:34) 
at gui.janelas.JanelaMain.<init>(JanelaMain.java:37) 
at gui.janelas.JanelaMain.getInstance(JanelaMain.java:144) 
at gui.updatelogs.ConnectionLog.<init>(ConnectionLog.java:13) 
at gui.updatelogs.ConnectionLog.getInstance(ConnectionLog.java:34) 
at gui.janelas.JanelaMain.<init>(JanelaMain.java:37) 
at gui.janelas.JanelaMain.getInstance(JanelaMain.java:144) 
at gui.updatelogs.ConnectionLog.<init>(ConnectionLog.java:13) 
at gui.updatelogs.ConnectionLog.getInstance(ConnectionLog.java:34) 
at gui.janelas.JanelaMain.<init>(JanelaMain.java:37) 
at gui.janelas.JanelaMain.getInstance(JanelaMain.java:144) 
at gui.updatelogs.ConnectionLog.<init>(ConnectionLog.java:13) 
at gui.updatelogs.ConnectionLog.getInstance(ConnectionLog.java:34) 
at gui.janelas.JanelaMain.<init>(JanelaMain.java:37) 
at gui.janelas.JanelaMain.getInstance(JanelaMain.java:144) 
at gui.updatelogs.ConnectionLog.<init>(ConnectionLog.java:13) 
at gui.updatelogs.ConnectionLog.getInstance(ConnectionLog.java:34) 
at gui.janelas.JanelaMain.<init>(JanelaMain.java:37) 
at gui.janelas.JanelaMain.getInstance(JanelaMain.java:144) 
at gui.updatelogs.ConnectionLog.<init>(ConnectionLog.java:13) 
at gui.updatelogs.ConnectionLog.getInstance(ConnectionLog.java:34) 
at gui.janelas.JanelaMain.<init>(JanelaMain.java:37) 
at gui.janelas.JanelaMain.getInstance(JanelaMain.java:144) 
at gui.updatelogs.ConnectionLog.<init>(ConnectionLog.java:13) 
at gui.updatelogs.ConnectionLog.getInstance(ConnectionLog.java:34) 
at gui.janelas.JanelaMain.<init>(JanelaMain.java:37) 
at gui.janelas.JanelaMain.getInstance(JanelaMain.java:144) 
at gui.updatelogs.ConnectionLog.<init>(ConnectionLog.java:13) 
at gui.updatelogs.ConnectionLog.getInstance(ConnectionLog.java:34) 
at gui.janelas.JanelaMain.<init>(JanelaMain.java:37) 
at gui.janelas.JanelaMain.getInstance(JanelaMain.java:144) 
at gui.updatelogs.ConnectionLog.<init>(ConnectionLog.java:13) 
at gui.updatelogs.ConnectionLog.getInstance(ConnectionLog.java:34) 
at gui.janelas.JanelaMain.<init>(JanelaMain.java:37) 
at gui.janelas.JanelaMain.getInstance(JanelaMain.java:144) 
at gui.updatelogs.ConnectionLog.<init>(ConnectionLog.java:13) 
at gui.updatelogs.ConnectionLog.getInstance(ConnectionLog.java:34) 
at gui.janelas.JanelaMain.<init>(JanelaMain.java:37) 
at gui.janelas.JanelaMain.getInstance(JanelaMain.java:144) 
at gui.updatelogs.ConnectionLog.<init>(ConnectionLog.java:13) 
at gui.updatelogs.ConnectionLog.getInstance(ConnectionLog.java:34) 
at gui.janelas.JanelaMain.<init>(JanelaMain.java:37) 
at gui.janelas.JanelaMain.getInstance(JanelaMain.java:144) 
at gui.updatelogs.ConnectionLog.<init>(ConnectionLog.java:13) 
at gui.updatelogs.ConnectionLog.getInstance(ConnectionLog.java:34) 
at gui.janelas.JanelaMain.<init>(JanelaMain.java:37) 
at gui.janelas.JanelaMain.getInstance(JanelaMain.java:144) 
at gui.updatelogs.ConnectionLog.<init>(ConnectionLog.java:13) 
at gui.updatelogs.ConnectionLog.getInstance(ConnectionLog.java:34) 
at gui.janelas.JanelaMain.<init>(JanelaMain.java:37) 
at gui.janelas.JanelaMain.getInstance(JanelaMain.java:144) 
at gui.updatelogs.ConnectionLog.<init>(ConnectionLog.java:13) 
at gui.updatelogs.ConnectionLog.getInstance(ConnectionLog.java:34) 
at gui.janelas.JanelaMain.<init>(JanelaMain.java:37) 
at gui.janelas.JanelaMain.getInstance(JanelaMain.java:144) 
at gui.updatelogs.ConnectionLog.<init>(ConnectionLog.java:13) 
at gui.updatelogs.ConnectionLog.getInstance(ConnectionLog.java:34) 
at gui.janelas.JanelaMain.<init>(JanelaMain.java:37) 
at gui.janelas.JanelaMain.getInstance(JanelaMain.java:144) 
at gui.updatelogs.ConnectionLog.<init>(ConnectionLog.java:13) 
at gui.updatelogs.ConnectionLog.getInstance(ConnectionLog.java:34) 
at gui.janelas.JanelaMain.<init>(JanelaMain.java:37) 
at gui.janelas.JanelaMain.getInstance(JanelaMain.java:144) 
at gui.updatelogs.ConnectionLog.<init>(ConnectionLog.java:13) 
at gui.updatelogs.ConnectionLog.getInstance(ConnectionLog.java:34) 
at gui.janelas.JanelaMain.<init>(JanelaMain.java:37) 
at gui.janelas.JanelaMain.getInstance(JanelaMain.java:144) 
at gui.updatelogs.ConnectionLog.<init>(ConnectionLog.java:13) 
at gui.updatelogs.ConnectionLog.getInstance(ConnectionLog.java:34) 
at gui.janelas.JanelaMain.<init>(JanelaMain.java:37) 
at gui.janelas.JanelaMain.getInstance(JanelaMain.java:144) 
at gui.updatelogs.ConnectionLog.<init>(ConnectionLog.java:13) 
at gui.updatelogs.ConnectionLog.getInstance(ConnectionLog.java:34) 
at gui.janelas.JanelaMain.<init>(JanelaMain.java:37) 
at gui.janelas.JanelaMain.getInstance(JanelaMain.java:144) 
at gui.updatelogs.ConnectionLog.<init>(ConnectionLog.java:13) 
at gui.updatelogs.ConnectionLog.getInstance(ConnectionLog.java:34) 
at gui.janelas.JanelaMain.<init>(JanelaMain.java:37) 
at gui.janelas.JanelaMain.getInstance(JanelaMain.java:144) 
at gui.updatelogs.ConnectionLog.<init>(ConnectionLog.java:13) 
at gui.updatelogs.ConnectionLog.getInstance(ConnectionLog.java:34) 
at gui.janelas.JanelaMain.<init>(JanelaMain.java:37) 
at gui.janelas.JanelaMain.getInstance(JanelaMain.java:144) 
at gui.updatelogs.ConnectionLog.<init>(ConnectionLog.java:13) 
at gui.updatelogs.ConnectionLog.getInstance(ConnectionLog.java:34) 
at gui.janelas.JanelaMain.<init>(JanelaMain.java:37) 
at gui.janelas.JanelaMain.getInstance(JanelaMain.java:144) 
at gui.updatelogs.ConnectionLog.<init>(ConnectionLog.java:13) 
at gui.updatelogs.ConnectionLog.getInstance(ConnectionLog.java:34) 
at gui.janelas.JanelaMain.<init>(JanelaMain.java:37) 
at gui.janelas.JanelaMain.getInstance(JanelaMain.java:144) 
at gui.updatelogs.ConnectionLog.<init>(ConnectionLog.java:13) 
at gui.updatelogs.ConnectionLog.getInstance(ConnectionLog.java:34) 
at gui.janelas.JanelaMain.<init>(JanelaMain.java:37) 
at gui.janelas.JanelaMain.getInstance(JanelaMain.java:144) 
at gui.updatelogs.ConnectionLog.<init>(ConnectionLog.java:13) 
at gui.updatelogs.ConnectionLog.getInstance(ConnectionLog.java:34) 
at gui.janelas.JanelaMain.<init>(JanelaMain.java:37) 
at gui.janelas.JanelaMain.getInstance(JanelaMain.java:144) 
at gui.updatelogs.ConnectionLog.<init>(ConnectionLog.java:13) 
at gui.updatelogs.ConnectionLog.getInstance(ConnectionLog.java:34) 
at gui.janelas.JanelaMain.<init>(JanelaMain.java:37) 
at gui.janelas.JanelaMain.getInstance(JanelaMain.java:144) 
at gui.updatelogs.ConnectionLog.<init>(ConnectionLog.java:13) 
at gui.updatelogs.ConnectionLog.getInstance(ConnectionLog.java:34) 
at gui.janelas.JanelaMain.<init>(JanelaMain.java:37) 
at gui.janelas.JanelaMain.getInstance(JanelaMain.java:144) 
at gui.updatelogs.ConnectionLog.<init>(ConnectionLog.java:13) 
at gui.updatelogs.ConnectionLog.getInstance(ConnectionLog.java:34) 
at gui.janelas.JanelaMain.<init>(JanelaMain.java:37) 
at gui.janelas.JanelaMain.getInstance(JanelaMain.java:144) 
at gui.updatelogs.ConnectionLog.<init>(ConnectionLog.java:13) 
at gui.updatelogs.ConnectionLog.getInstance(ConnectionLog.java:34) 
at gui.janelas.JanelaMain.<init>(JanelaMain.java:37) 
at gui.janelas.JanelaMain.getInstance(JanelaMain.java:144) 
at gui.updatelogs.ConnectionLog.<init>(ConnectionLog.java:13) 
at gui.updatelogs.ConnectionLog.getInstance(ConnectionLog.java:34) 
at gui.janelas.JanelaMain.<init>(JanelaMain.java:37) 
at gui.janelas.JanelaMain.getInstance(JanelaMain.java:144) 
at gui.updatelogs.ConnectionLog.<init>(ConnectionLog.java:13) 
at gui.updatelogs.ConnectionLog.getInstance(ConnectionLog.java:34) 
at gui.janelas.JanelaMain.<init>(JanelaMain.java:37) 
at gui.janelas.JanelaMain.getInstance(JanelaMain.java:144) 
at gui.updatelogs.ConnectionLog.<init>(ConnectionLog.java:13) 
at gui.updatelogs.ConnectionLog.getInstance(ConnectionLog.java:34) 
at gui.janelas.JanelaMain.<init>(JanelaMain.java:37) 
at gui.janelas.JanelaMain.getInstance(JanelaMain.java:144) 
at gui.updatelogs.ConnectionLog.<init>(ConnectionLog.java:13) 
at gui.updatelogs.ConnectionLog.getInstance(ConnectionLog.java:34) 
at gui.janelas.JanelaMain.<init>(JanelaMain.java:37) 
at gui.janelas.JanelaMain.getInstance(JanelaMain.java:144) 
at gui.updatelogs.ConnectionLog.<init>(ConnectionLog.java:13) 
at gui.updatelogs.ConnectionLog.getInstance(ConnectionLog.java:34) 
at gui.janelas.JanelaMain.<init>(JanelaMain.java:37) 
at gui.janelas.JanelaMain.getInstance(JanelaMain.java:144) 
at gui.updatelogs.ConnectionLog.<init>(ConnectionLog.java:13) 
at gui.updatelogs.ConnectionLog.getInstance(ConnectionLog.java:34) 
at gui.janelas.JanelaMain.<init>(JanelaMain.java:37) 
at gui.janelas.JanelaMain.getInstance(JanelaMain.java:144) 
at gui.updatelogs.ConnectionLog.<init>(ConnectionLog.java:13) 
at gui.updatelogs.ConnectionLog.getInstance(ConnectionLog.java:34) 
at gui.janelas.JanelaMain.<init>(JanelaMain.java:37) 

Спасибо.

+0

Вы имели смысл сделать 'if (JanelaMain.jam == null) {' equal to 'if (jam == null) {' –

+1

Wow, Singleton в зависимости от другого Singleton? Возможно, вы изобрели новый анти-шаблон ... Я предлагаю назвать это * The Twingleton Pattern *, потому что близнецы также зависят друг от друга. – fredoverflow

ответ

2

Проблема не в этих классах, а в классе ConnectionLog. Вы пытаетесь создать экземпляр в JanelaMain, и ConnectionLog пытается создать экземпляр JanelaMain.

@SuppressWarnings("serial") 
public class JanelaMain extends JFrame { 

private FlowLayout layout       = new FlowLayout(); 
private JTextField jtxt_send      = null; 

//CUSTOM SWING COMPONENTS 
private ConnectionLog cn_log    = ConnectionLog.getInstance(); 
private TextLog msg_list     = TextLog.getInstance(); 


@SuppressWarnings("serial") 
public class ConnectionLog extends JTextField { 

private JanelaMain jam = JanelaMain.getInstance(); 
+0

Вы убили его, цикл генерируется вызовами конструктора, однако он не должен был считать, что значение статического класса равно null, и цикл должен остановиться. – raphaelbgr

3

Ваш код выглядит немного странно, почему вы даете синглтон другому? Вы можете использовать класс singelton в том месте, в котором он вам нужен, и нет необходимости передавать его другому классу.

Смежные вопросы