0

コンストラクター内でオブジェクトをインスタンス化し、コンストラクター外でオブジェクトをインスタンス化する理由。これを行うことの利点/欠点は何ですか。

public class HomePage_Util {
private Common_Functions cfObj = new Common_Functions();
HomePage_OR home_ORobj;
Logging logObj = new Logger();
public static String scptName;
public ArrayList<String> homeScriptMsgList = new ArrayList<String>();

public HomePage_Util(WebDriver driver) {
    home_ORobj = new HomePage_OR();
    PageFactory.initElements(driver, home_ORobj);
}
4

7 に答える 7

0

コンストラクターの外部で開始されたインスタンス フィールドは、新しいオブジェクトが作成されたときに最初は常にそのようになります (すべてのインスタンスについて)。コンストラクターで開始されたものは、例の WebDriver のように新しいインスタンスに対して特別な意味を持つ場合があるため、他の場所で開始することはできません。特定の型のインスタンスを引数として渡す必要があるコンストラクターは、他のものを渡すことができず、それなしでは構築できないため、設計を強制します。

クラスには、異なる動作をし、異なるフィールドをインスタンス化し、他のものをそのままにしておく可能性のある複数のコンストラクターが含まれる場合があります (クラスに複数の目的がある場合、実際には設計が悪いことを示している可能性があります)。

さらに、クラスにデフォルトのコンストラクターがない場合 => 逆シリアル化時にコンストラクターは呼び出されません。

于 2013-09-10T08:00:48.443 に答える
0

コンストラクタは基本的にnew object of a class. オブジェクトを作成すると、そのオブジェクトのすべての変数のコピーが作成され、割り当てられdefault valueます。

コンストラクターでいくつかの変数を開始する目的は、オブジェクトの作成時に値を割り当てることです。そのため、暗黙的に値を割り当てる必要はありません。

于 2013-09-10T07:53:29.983 に答える
0

私の推測では、そのようなコードの作成者は、initElements() の呼び出しの前に home_ORobj が初期化されるかどうか確信が持てませんでしたが、外部のものは最初に初期化されるため、問題ではありません。

ただし、それらが相互に依存している場合 (つまり、コンストラクターへのパラメーターで別のものを使用している場合) は、コード フォーマッターが要素のリストを並べ替えてコードを壊す可能性があるため、それらをコンストラクターに配置することをお勧めします。

于 2013-09-10T07:53:31.477 に答える