1

クラスをリファクタリングして、パブリック コンストラクターの代わりにプライベート コンストラクターを持つビルダーを使用しています。以下に示すように、古い非推奨のパブリック コンストラクターでビルダーを使用したいと考えています。(これは私が達成しようとしている動作の例です)

// old public construcor
@Deprecated
public MyClazz(){
    return new MyClazzBuilder().Build();
}

これにより、「結果型が void のメソッドから値を返すことはできません」というメッセージが表示されます

このタイプの機能はJavaで可能ですか? これはどのように達成できますか?

更新:このコードは分散 jar の一部です。下位互換性を維持する必要があるため、古いコンストラクターを削除することはできません。

4

2 に答える 2

3

いいえ。コンストラクターはオブジェクトを操作しますが、オブジェクトを返しません。[脚注 1]

この種の機能を取得する 1 つの方法は、init()メソッドを使用することです。

@Deprecated
public MyClazz() {
  init();
}

public void init() {
  // do the actual work
}

これで、ビルダーは同じinit()メソッドを呼び出して、コードが 2 つの場所にあるのを回避できます。

非推奨の署名を残しているため、インスタンスを準備するためのロジックを複数の場所に分割することは避けられません。これは理想的ではありませんが、非推奨と後方互換性の維持の代償です。

[脚注 1] Java オブジェクトのライフサイクルでは、最初にオブジェクト メモリが割り当てられますが、すべてのフィールドにはジャンク コンテンツが含まれます。次に、これらの無意味な値をすべて実際の値に変更することで、一貫性のある状態にするためにメモリ上でコンストラクターが実行されます。コンストラクターが動作するメモリは既に存在するため、構築中のオブジェクトを別のオブジェクトに置き換えることはできません。コンストラクターからの戻り値は、まさにこの種の置換であり、言語ではサポートされていません。そのトリックが必要な場合は、コンストラクターの代わりにファクトリー/ビルダーを使用してください。コンストラクターはそれを行うことはできません。

于 2013-04-26T17:54:25.807 に答える
1

コンストラクターは値を返しません。コンストラクターのシグネチャに「宣言された」戻り値の型がないことに注意してください。いくつかのオプションがあります:

1) コンストラクターをプライベートとしてマークし、コンパイル エラーをすぐに解決します
。2) コンストラクターを非推奨にし、元の実装をそこに残します。

番号 2 をお勧めします。あなたが行ったことは、コンストラクターを非推奨にしてから、実装を変更したことです。それは非推奨の仕組みではありません。

于 2013-04-26T17:55:02.643 に答える