【java解惑】リロードコンストラクション関数


次のコードを示します.
public class Example046 {

	private Example046(Object o) {
		System.out.println("Object");
	}

	private Example046(double[] dArray) {//2
		System.out.println("double array");
	}

	private Example046(String str) {//3
		System.out.println("string");
	}

	public static void main(String[] args) {
		new Example046(null);
	}
}

出力の説明:
上記のプログラムをコンパイルすると、「The constructor Example 046(Object)is ambiguous」エラーが表示され、コンストラクタがぼやけています.2または3コンストラクション関数の1つを削除すれば、正しく実行できます.実行結果は2と3のコンストラクション関数を除いた残りのものが印刷されます.
分析のまとめ:
上記のコードを分析するには、javaリロードの解析手順を理解する必要があります.Javaのリロード解析プロセスは2段階で実行されます.第1段階は、入手可能で適用可能なすべての方法またはコンストラクタを選択する.第2のフェーズは、第1のフェーズで選択された方法またはコンストラクタの中で最も正確な1つを選択します.1つの方法またはコンストラクタが別の方法またはコンストラクタに伝達される任意のパラメータを受け入れることができる場合、私たちは第1の方法が第2の方法よりも正確性に欠けていると言います.上記のコードでは、2番目と3番目の構造関数は正確であり、1番目は2と3の任意のパラメータを受け入れることができるため、正確ではない.最初のプログラムには2つの正確な構造関数(2と3)があるため,コンパイラはどちらを選択するか分からないため,エラーを提示する.いずれかを削除すると、コンパイラは正確な構造関数を決定できるので、印刷されます.
nullパラメータを使用してコンストラクタを呼び出すには、new Example 046()nullというコードを書く必要があります.これにより、Example 046(Object)のみが適用可能であることが保証される.より一般的には、コンパイラに正確なリロードバージョンを選択するように強制するには、実際のパラメータを形式パラメータで宣言されたタイプに変換する必要があります.
コードを書く場合、上記のリロード構造関数は推奨されません.リロードの代わりに静的構造関数と共通のファクトリメソッドを使用できます.確かにリロードを行った場合は、すべてのリロードで受け入れられるパラメータタイプが互いに互換性がないことを確認してください.これにより、両方のリロードが同時に適用されません.それができない場合は、適用可能なすべてのリロードが同じ動作をしていることを確認します.
つまり、リロードバージョンの解析は混同される可能性があります.できるだけ重荷を避けるべきで、もしあなたが重荷をしなければならないならば、あなたは上述の方針を守って、このような混同を最小化しなければなりません.設計の悪いAPIが異なるリロード・バージョン間で選択を強制する場合は、実際のパラメータを呼び出したいリロード・バージョンの形式パラメータが持つタイプに変換します.
注:本「java解惑」シリーズは、ブロガーが「java解惑」の原書を読んだ後、原書の説明と例の部分を改編し、博文として発表したものです.すべての例はgithubで直接テストに合格し、共有されています.これらの例を通じて自分を励まして他人に恩恵を与える.また、このシリーズのすべてのブログは、ブロガー個人の微信公衆番号で「愛題猿」や「ape_it」を検索して読むことができます.もし文章の中に原作者の権利を侵害する内容があれば、直ちにブロガーに知らせて、直ちに削除してください.もし読者が文章の中の内容に異議があれば、ブログの伝言や微信の公衆番号の伝言などの方法で共同で検討することを歓迎します.
ソースアドレスhttps://github.com/rocwinger/java-disabuse
本文は“winger”のブログから出て、転載をお断りします!