2011-09-15 3 views
1

Exemple 1Quelle implémentation du constructeur est correcte?

import javax.swing.*; 
import java.awt.*; 

public class Painter extends JPanel{ 

    public Painter(){ 
    buildGUI(); 
    } 

    private void buildGUI(){ 
    JFrame frame = new JFrame(); 
    frame.setLayout(new BorderLayout()); 
    frame.setTitle("Paint drawing demonstration"); 
    new Center_frame(frame); 

    JPanel headerPanel = new JPanel(); 
    headerPanel.add(new JLabel("The drawing panel is below")); 

    Drawing_panel dp = new Drawing_panel(); 

    frame.add(BorderLayout.NORTH,headerPanel); 
    frame.add(BorderLayout.SOUTH,dp); 

    frame.pack(); 
    frame.setVisible(true); 
    } 

    public static void main(String args[]){ 
     new Painter(); 
    } 

}//end class Painter 

Example2

import javax.swing.*; 
import java.awt.*; 

public class Painter extends JPanel{ 

    public Painter(){ 
     JFrame frame = new JFrame(); 
     frame.setLayout(new BorderLayout()); 
     frame.setTitle("Paint drawing demonstration"); 
     new Center_frame(frame); 

     JPanel headerPanel = new JPanel(); 
     headerPanel.add(new JLabel("The drawing panel is below")); 

     Drawing_panel dp = new Drawing_panel(); 

     frame.add(BorderLayout.NORTH,headerPanel); 
     frame.add(BorderLayout.SOUTH,dp); 

     frame.pack(); 
     frame.setVisible(true); 
    } 

public static void main(String args[]){ 
    //create a Painter object 
    new Painter(); 
} 

}//end class Painter 
+0

Ils sont essentiellement les mêmes. – mrkhrts

+1

Lequel fonctionne? Que voulez-vous dire par "correct"? Lequel pensez-vous est mieux, et pourquoi? Aussi, http://codereview.stackexchange.com. –

+0

Eh bien ça dépend. Allez-vous jamais utiliser 'buildGUI()' en dehors du constructeur? – NullUserException

Répondre

4

Les deux sont presque aussi "correct" (selon la définition d'une de de "correct" :-), bien que je préférerais la celui-ci comme il est plus simple.

Extraire tout le corps de votre constructeur ne ferait que rendre votre propre code si vous aviez d'autres constructeurs/méthodes appelant buildGUI (donc double emploi en éliminant), ou si vous pouvez diviser le corps en plusieurs petites méthodes distinctes avec des noms explicites (rendant ainsi le code plus lisible).

+1

les deux sont des travaux pas corrects +1 – mKorbel

0

Ils sont fonctionnellement identiques. C'est une question de style.

En général, je dirais que ni l'un ni l'autre n'est correct. La logique dans le constructeur doit être minimale et avoir le moins de chance de générer une erreur. Je déplace l'appel buildGUI dans une méthode init, et l'appelle séparément de Main après avoir instancié l'objet.

+1

Cela ouvrirait la chance pour les clients oubliant d'initialiser votre objet correctement, causant des bugs subtils sur toute la ligne. Ou en ignorant une initialisation échouée, aboutissant ainsi à un objet dans un état incohérent, entraînant ... –

+1

Dans le cas d'un objet UI, vous pouvez gérer l'initialisation dans l'un des événements de création. Dans le cas d'un objet générique, vous pouvez gérer via une initialisation paresseuse. Pas besoin de forcer l'appelant à init explicitement, je ne faisais que rester simple. En général, je pense que les constructeurs devraient être simples, petits et aussi résistants aux erreurs que possible. – groundh0g

Questions connexes