5

これは個人の好みとワークフローの問題かもしれませんが、それ以上の場合は、とにかく尋ねるべきだと思います.

Java では、コンストラクターを使用してインスタンスを作成する場合と、静的メソッド (インスタンスを返す) を使用してインスタンスを作成する場合の違いは何ですか? たとえば、私が取り組んでいるプロジェクトからこのコードを少し取ってください (投稿時に手作業で書かれているため、いくつかのショートカットと自由が取られています)。

Plugin main;
Map<int, int> map;

public Handler(Plugin main) {
    this.main = main;
}

public static Handler init(Plugin main) {
    Handler handler = new Handler(main);
    handler.createMap();
}

public void createMap() {
    this.map = Maps.newHashMap();
}

このような場合、使用することの違いは何ですか

Handler handler = new Handler(this);

Handler handler = Handler.init(this);

createMap()Plugin クラスでは、コンストラクターで呼び出されないため、後者でのみ実行されるという事実に加えて?

この場合、明確にするために、Pluginメインクラスと見なされます。

私は中間レベルのプラグインを作成できる Java 構文を十分に知っていますが、これを行う 2 つの方法の違いを知るには Java 自体について十分ではありません。

編集:たとえば、Maps作成にMap使用したクラスは、オブジェクトの代わりにクラスを使用して呼び出される静的ファクトリ メソッドを使用します (その用語を正しく使用していることを願っています)。

4

2 に答える 2

7

静的ファクトリ メソッドには、長所と短所の両方があります。

利点

  • 説明的で意味のある名前。
  • 呼び出されると、新しいインスタンスを返すかどうかを決定できます
  • 戻り値の型の任意のサブタイプのオブジェクトを返すことができます
  • パラメータ化された型のインスタンスを作成する冗長性を軽減します

短所

  • 静的ファクトリ メソッドのみを提供する場合、パブリック コンストラクターまたはプロテクト コンストラクターを持たないクラスはサブクラス化できません。
  • それらは他の静的メソッドと容易に区別できません

出典: 有効な Java、第 2 版。

于 2013-02-27T01:54:43.047 に答える
6

違いは、静的ファクトリ メソッドがより柔軟であることです。インスタンスを返すあらゆる種類の方法を持つことができます。それは他の側面のことをすることができます。よりわかりやすい名前を付けることができます。foo(args)静的インポートまたは継承により、単純な名前 (例: ) で呼び出すことができます。

コンストラクター呼び出しはより確実です。呼び出し元は何が起こっているかを正確に知っています。その正確なクラスの新しいインスタンスが作成されます。

于 2013-02-27T01:14:27.077 に答える