2011-09-15 5 views
1

例1どのコンストラクタの実装が正しいか?

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 

例2、私が好むだろうけれども、それらの両方がほぼ均等に "正しい"( "正しい" :-)の一つの定義に依存している

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

これらは本質的に同じです。 – mrkhrts

+1

どちらが使えますか? 「正しい」とはどういう意味ですか?あなたはどちらが良いと思いますか、なぜですか?また、http://codereview.stackexchange.com。 –

+0

それはまあそれに依存します。コンストラクタの外で 'buildGUI()'を使うつもりはありますか? – NullUserException

答えて

4

後者の方が簡単です。

buildGUIを呼び出す他のコンストラクタ/メソッド(重複を排除する)がある場合、または本体を複数の別個の小さなメソッドに分かりやすい名前で分けることができる場合は、コンストラクタ全体を抽出するだけでコードがきれいになりますコードをより読みやすくする)。

+1

両方が正しく動作しません+1 – mKorbel

0

機能的には同じです。それはスタイルの問題です。

一般に、どちらも正しいとは思わないでしょう。コンストラクタ内のロジックは最小限に抑えられ、エラーが発生する可能性は最小限に抑えられます。 buildGUIの呼び出しをinitメソッドに移動し、オブジェクトをインスタンス化した後にMainとは別に呼び出します。

+1

これは、クライアントがオブジェクトを適切に初期化するのを忘れて、微妙なバグが発生する可能性があります。または、失敗した初期化を無視して、オブジェクトが矛盾した状態で終了して、... –

+1

UIオブジェクトの場合、作成イベントの1つで初期化を処理できます。ジェネリックオブジェクトの場合は、遅延初期化によって処理できます。呼び出し側に明示的にinitを強制する必要はありません。一般に、私は、コンストラクタは単純で、小さく、エラー耐性があるものでなければならないと思います。 – groundh0g

関連する問題