チェックスタイルは次のように述べています。
Class should define a constructor.
PMDは次のように述べています。
Avoid unnecessary constructors - the compiler will generate these for you.
誰が正しいですか?または、このように言いましょう - クラスに空のデフォルト ctor を持つことの長所と短所は何ですか?
PMDの答えが好きです。コードが少ないほど良い。コンパイラが作成するコンストラクタを作成しないでください。
私の印象では、コンストラクターを作成する主な理由は、コンストラクターが Java でどのように機能するかを理解していない貧弱なプログラマーがコードにつまずいて混乱する可能性があるということです。不必要にあいまいなコードを書くのは好きではありませんが、馬鹿げたコードを書くのも好きではありません。
しかし、これは私が執着していて、おそらく不合理です。言語ではなくビジネスに焦点を当て、言語の専門家ではないアプリケーション プログラマーの世界があります。多くの人が使用するサバイバル テクニックは、一貫したスタイルを持つことです。それが絶対に必要かどうかは問題ではありません。
「物議を醸す」多くの決定と同様に、真実は、実際にはそれほど重要ではないということです. コンストラクタを書くか書かないか。コードの品質と保守性への影響はごくわずかです。他の人とコーディングしている場合は、一貫性を保つために同じスタイルを採用しますが、それ以外の場合は、好きなように行ってください。
デフォルトのコンストラクターが唯一のコンストラクターである場合、空の本体を使用して明示的に記述するか、省略した場合と100%同等です。ただし、デフォルトであるかどうかに関係なく、明示的に定義されたコンストラクターがある場合、コンパイラーはデフォルトのコンストラクターを生成しません。これは、コンパイラーを使用してコンストラクターを生成し、後で代替コンストラクターを追加すると、デフォルトのコンストラクターがなくなることを意味します。個人的には、とにかくコンパイラに生成を任せる傾向があります。そのデフォルトのコンストラクターが使用されていた場合、コンパイル警告が生成され、その時点で簡単に追加できます。それ以外の場合は、なぜそれを維持するのですか?
追加することの1つは、コンストラクターが指定されていない場合、コードが依存する可能性のある暗黙のデフォルトコンストラクターがあることです。
次に、特定のコンストラクターを追加すると、コードがコンパイルされなくなる可能性があります。さらに悪いことに、コードが実行されない可能性があります(パラメーターのないコンストラクターへの反映依存関係である可能性があります。ほとんどのORMツールでは、永続エンティティーにデフォルトのコンストラクターが存在する必要があります)。
そのため、必要に応じてデフォルトのコンストラクターを明示的に追加する必要があります。
Checkstyleを使います。明示的な(noarg)コンストラクターがないと、それが意図されているかどうかは誰にもわかりません。
このユーティリティクラスを検討してください。
public class Util {
// no constructor given - implicit default constructor
// intended? probably not, but who knows
public static void foo() {
// blabla
}
public static void bar() {
// more blabla
}
}
デフォルトでは、コンパイラはデフォルトのコンストラクターを生成するため、特別なアクションを指定したくない場合 (メンバーの初期化はここでは重要ではありません)、コンストラクターを指定する必要はありません。
もう1つのことは、一部のクラスは一貫した状態を持つ必要があるということです。たとえば、Book クラスがあります。タイトルのない本を作成しても意味がないので、文字列パラメーターでコンストラクターを指定する必要があります。
public Book(String name) {
this.name = name;
}
デフォルト コンストラクターに関しては、クラスをシリアル化するか、マーシャリング/アンマーシャリングで使用する必要がある場合に必要になる場合があります (JAXB では空のデフォルト コンストラクターが必要です)。
それがポイントではなく、クラスにいわゆる一貫した状態がない場合は、空のデフォルト コンストラクターを宣言する必要はまったくありません。
デフォルトのコンストラクターはデフォルトで public であることを覚えておく必要があるため、これに何らかの制限が必要な場合は、明示的なコンストラクターを宣言することを検討してください。
また、クラスがかなり長い場合は、読みやすさを向上させるために空のデフォルト コンストラクターを宣言することを検討できます。
私はやや劣ったコードに似ていますが、デフォルトのコンストラクターを使用すると、デバッグが必要なときはいつでもブレークポイントを簡単に設定できます。
とにかく、PMD のウェブサイトでも、この問題は物議をかもしていると述べていることを思い出してください :)
IMOClass should define a constructor
は、デフォルトのコンストラクターに依存している場合、インスタンス変数にデフォルト値 (整数の場合はゼロ、文字列の場合は null など) があるためです。そのクラスのオブジェクトが作成されるたびにインスタンス変数を何らかのデフォルト値に設定したい場合は、自分でコンストラクターを定義するのが良い選択です。(getter および setter メソッドを使用したくない場合)
class Cube {
private int length;
private int breadth;
private int height;
public Cube() {
length = 10;
breadth = 10;
height = 10;
}
......
......
}
クラス Cube1 のオブジェクトを作成すると、そのオブジェクトのすべてのインスタンス変数が 10 に設定されます。ここでコンストラクターを使用しない場合、インスタンス変数 (長さ、幅、高さ) はデフォルト値 (ゼロ) になります。この場合)。
編集:[もう1つ追加]
デフォルトのコンストラクターを生成するためにコンパイラーに依存していて、ユーザーから引数を取るいくつかのコンストラクターを使用したい場合は、デフォルトのコンストラクターを定義する必要があります。そうしないと、コンパイラーはエラーを生成します。
注意: コンパイラは、そのクラスに他のコンストラクタが含まれていない場合にのみ、クラスのデフォルト コンストラクタを作成します。
私は必要なときだけコードを書く傾向があります。他のコンストラクターが必要ない場合は、コンパイラーに生成させてください。それ以外の場合は、必要なすべてのコンストラクターをコーディングします。