1

ほぼ同じタスクに対して異なる名前のメソッドを持つことは理にかなっています。たとえば、

  • open(String filename);
  • createThenOpen(String filename); // First create the file with default contents, then process the file.

この命名方法は、コンストラクターでは機能しません。コンストラクターが上記のようなファイル名を取ると想像してください。2 つのケースを処理するためのさまざまなオプションがあります。

  1. コンストラクターの If ステートメント: ファイルが存在しない場合は作成します。コンストラクターの動作は暗黙的であり、呼び出し元が既存のファイルを開く代わりに不要なファイルを作成する可能性があるため、これは適切ではありません。
  2. コンストラクターにフラグを追加します: MyClass(String filename, boolean createNew). MyClass("hello.txt", true)like の呼び出しは不可解なので、あまり良くありません。
  3. 1 つの引数が常にファイルの存在を想定するようにオーバーロードし、追加のダミー パラメーターの存在はファイルを作成する必要があることを意味します。これも醜い。
  4. RandomAccessFile(File file, String mode)where modeis"r"などの文字列フラグを追加"rw"します。これは私の目的には非常に不格好です。
  5. のにenum似たフラグを追加します。かなりダサい感じも。Filescopy(Path source, Path target, CopyOption... options)
  6. 引数を取らないコンストラクターを用意し、オブジェクトが作成された直後に上記のような別のメソッドが呼び出されるようにします。指定されたファイルのデータを使用してインスタンス化せずにオブジェクトのインスタンスを作成するのは意味がないので、良くありません。

現在、私は実際には上記の番号 (6) を支持しているようで、パラメーターのないコンストラクターの直後に異なる名前の 2 つのメソッドを呼び出すだけです。オプションを見落としていませんか、またはこれらのシナリオに対する「所定の」アプローチはありますか?

編集:以下の他の人が指摘したように、もちろん7番目の、おそらく最も明白なオプションがあります:

  1. ファクトリメソッドを使用してください!
4

2 に答える 2

2

パラメーターの長いリストを使用してコンストラクターを作成し、コンストラクターを呼び出す正確なパラメーター リストを含む多くの名前付きメソッドをprotected導入します。public staticcreateFooWithBar()

于 2016-02-02T11:32:17.233 に答える
0

コンストラクターをプライベートにして、パブリック ファクトリ メソッドを追加します。これはよくあるパターンだと思います。

もう1つのパターンは「ビルダー」です。同じパッケージのクラスだけがコンストラクターにアクセスできるようにします。コンストラクターを呼び出し、オブジェクトの構築に必要なその他のメソッドを呼び出すビルダー (または、必要に応じて複数のビルダー) を同じパッケージに追加します。

于 2016-02-02T11:37:48.167 に答える