Algunas preguntas sobre mejorar estructura de código.

Hola a todos, tengo unas preguntas acerca de unas dudas que siempre he tenido cuando programo, no cuento con grandes habilidades, es más no tengo ni un nivel intermedio. Hice un pequeño ejemplo con algunos comentarios donde expongo algunas de mis dudas.

package classes;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class MyFrame extends JFrame{

    private Container container;
    private JButton button_South, button_North, button_West, button_East,
                button_Center;

    public MyFrame(){
       
        container = getContentPane();
        Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
        setSize(dimension.getSize());
           
        addWindowListener(new WindowAdapter(){
               
            public void windowClosing(WindowEvent e){                  
               
                  /*¿Qué es más recomendable, utilizar dispose() o
                   * System.exit(0)?, ¿Cuál es la diferencia entre ellas o son
                   * simplemente intercambiables?
                   */

            }  
               
        });
           
        initButtons();
        addButtonListeners();
        pack();
        setVisible(true);
    }    
       
    public void initButtons(){
       
        button_South = new JButton("South");
        container.add(button_South, BorderLayout.SOUTH);
           
        button_North = new JButton("North");
        container.add(button_North, BorderLayout.NORTH);
           
        button_East = new JButton("East");
        container.add(button_East, BorderLayout.EAST);
           
        button_West = new JButton("West");
        container.add(button_West, BorderLayout.WEST);
           
        button_Center = new JButton("Center");
        container.add(button_Center, BorderLayout.CENTER);            
    }
       
   
    //Clases anónimas - ¿Es pecado abusar de ellas?
    public void addButtonListeners(){
       
        button_South.addActionListener(new ActionListener(){            
           
            public void actionPerformed(ActionEvent e){
               
                    //llamada a loquesea1();
            }                              
        });
           
        button_North.addActionListener(new ActionListener(){
           
            public void actionPerformed(ActionEvent e){
               
                    //llamada a loquesea2();
            }                              
        });
           
        button_East.addActionListener(new ActionListener(){
           
            public void actionPerformed(ActionEvent e){
               
                    //llamada a loquesea3();
            }                              
        });
           
        button_West.addActionListener(new ActionListener(){
           
            public void actionPerformed(ActionEvent e){
               
                    //llamada a loquesea4();
            }                              
        });
           
        button_Center.addActionListener(new ActionListener(){
           
            public void actionPerformed(ActionEvent e){
               
                    //llamada a loquesea5();
            }                              
        });                
    }
       
    public static void main(String [] args){
       
        /*Más o menos tengo entendido para que se utiliza SwingUtilities.invokeLater
         *pero... ¿No es necesario utilizarlo si mi aplicación no realiza un arduo trabajo
         * de repintado o demás procesos que necesiten mucho tiempo para su realización?
         */

        SwingUtilities.invokeLater(new Runnable(){
           
            public void run(){
               
                MyFrame instancia = new MyFrame();
            }
        });          
    }
}

Algunas otras preguntas:

1. ¿Es buena práctica que inicialice mis variables u objetos en métodos (como en el ejemplo, un método para inicializar y agregar componente y otro para agregar listeners como en el ejemplo) y los llame al constructor? Tengo esa costumbre para tener más ordenado el código pero no sé si tenga algún impacto negativo en el rendimiento de una aplicación el tener tantas funciones solo para inicializar o siemplemente no sea buena práctica.

2. ¿Cuando remuevo y agrego componentes (de manera ardua) de algún contenedor como por ejemplo un JPanel, es buena práctica el llamar explícitamente al recolector de basura?

Bueno, creo que eso todo por ahora, más adelante preguntaré algunas otras cosas que por ahora no me acuerdo jaja, espero alguien me instruya, saludos a toda la comunidad.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

Respuesta rápida: package

Respuesta rápida:

package classes;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class MyFrame /*extends JFrame*/ {

    private Container container;
    private JButton southButton;
    private JButton northButton;
    private JButton westButton;
    private JButton eastButton;
    private JButton centerButton;

    private JFrame frame;

    public MyFrame(){
       
        frame = new JFrame();
        container = frame.getContentPane();
        Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
        frame.setSize(dimension.getSize());
           
        frame.addWindowListener(new WindowAdapter(){
               
            public void windowClosing(WindowEvent e){                  
               
                  /*¿Qué es más recomendable, utilizar dispose() o
                   * System.exit(0)?, ¿Cuál es la diferencia entre ellas o son
                   * simplemente intercambiables?
                   */

                   // A:
                   frame.dispose();

            }  
               
        });
           
        initButtons();
        addButtonListeners();
        frame.pack();
        frame.setVisible(true);
    }    
       
    public void initButtons(){
       
        southButton = new JButton("South");
        container.add(southButton, BorderLayout.SOUTH);
           
        northButton = new JButton("North");
        container.add(northButton, BorderLayout.NORTH);
           
        eastButton = new JButton("East");
        container.add(eastButton, BorderLayout.EAST);
           
        westButton = new JButton("West");
        container.add(westButton, BorderLayout.WEST);
           
        centerButton = new JButton("Center");
        container.add(centerButton, BorderLayout.CENTER);            
    }
       
   
    //Clases anónimas - ¿Es pecado abusar de ellas?
    public void addButtonListeners(){
       
        southButton.addActionListener(new ActionListener(){            
           
            public void actionPerformed(ActionEvent e){
               
                    //llamada a loquesea1();
            }                              
        });
           
        northButton.addActionListener(new ActionListener(){
           
            public void actionPerformed(ActionEvent e){
               
                    //llamada a loquesea2();
            }                              
        });
           
        eastButton.addActionListener(new ActionListener(){
           
            public void actionPerformed(ActionEvent e){
               
                    //llamada a loquesea3();
            }                              
        });
           
        westButton.addActionListener(new ActionListener(){
           
            public void actionPerformed(ActionEvent e){
               
                    //llamada a loquesea4();
            }                              
        });
           
        centerButton.addActionListener(new ActionListener(){
           
            public void actionPerformed(ActionEvent e){
               
                    //llamada a loquesea5();
            }                              
        });                
    }
       
    public static void main(String [] args){
       
        /*Más o menos tengo entendido para que se utiliza SwingUtilities.invokeLater
         *pero... ¿No es necesario utilizarlo si mi aplicación no realiza un arduo trabajo
         * de repintado o demás procesos que necesiten mucho tiempo para su realización?
         */

        SwingUtilities.invokeLater(new Runnable(){
           
            public void run(){
               
                MyFrame instancia = new MyFrame();
            }
        });          
    }
}

Luego escribo más porque ya me apagaron las luces