[解決済み] Java コンストラクタのスタイル: パラメータが NULL でないことを確認する
2023-08-18 05:13:22
質問
いくつかのパラメータを受け取るクラスがある場合、ベストプラクティスは何でしょうか?
null
?
以下は当たり前ですが、例外が少し不特定多数になります。
public class SomeClass
{
public SomeClass(Object one, Object two)
{
if (one == null || two == null)
{
throw new IllegalArgumentException("Parameters can't be null");
}
//...
}
}
ここでは、例外によってどのパラメータがnullであるかがわかりますが、コンストラクタはかなり醜いものになっています。
public class SomeClass
{
public SomeClass(Object one, Object two)
{
if (one == null)
{
throw new IllegalArgumentException("one can't be null");
}
if (two == null)
{
throw new IllegalArgumentException("two can't be null");
}
//...
}
ここではコンストラクタはよりすっきりしていますが、今度はコンストラクタのコードは実際にはコンストラクタの中にありません。
public class SomeClass
{
public SomeClass(Object one, Object two)
{
setOne(one);
setTwo(two);
}
public void setOne(Object one)
{
if (one == null)
{
throw new IllegalArgumentException("one can't be null");
}
//...
}
public void setTwo(Object two)
{
if (two == null)
{
throw new IllegalArgumentException("two can't be null");
}
//...
}
}
どのスタイルが一番良いですか?
あるいは、もっと広く受け入れられている代替案があるのでしょうか?
どのように解決するのですか?
2番目か3番目です。
なぜなら、それはあなたのAPIのユーザーに、何が正確に間違っていたのかを伝えるからです。
より冗長性を減らすには
Validate.notNull(obj, message)
を使います。このように、あなたのコンストラクタは次のようになります。
public SomeClass(Object one, Object two) {
Validate.notNull(one, "one can't be null");
Validate.notNull(two, "two can't be null");
...
}
セッターにチェックを入れることも可能で、同じ冗長性コメントが付きます。セッターがオブジェクトの一貫性を保持する役割も持っている場合、3番目も選択できます。
関連
-
SLF4J: クラス・パスに複数のSLF4Jバインディングが含まれています。
-
[解決済み] JavaScriptで空文字列/未定義文字列/null文字列をチェックするにはどうすればよいですか?
-
[解決済み] JavaScriptでNULL、未定義、空白の変数をチェックする標準的な関数はありますか?
-
[解決済み] Java で、あるコンストラクタを別のコンストラクタから呼び出すにはどうすればよいですか?
-
[解決済み] instanceofを呼び出す前にnullチェックは必要ですか?
-
[解決済み] あるコンストラクタを別のコンストラクタから呼び出す
-
[解決済み] Javaオプションパラメータ
-
[解決済み] JavaScriptでNULL値をチェックするにはどうしたらいいですか?
-
[解決済み] ConcurrentHashMapとCollections.synchronizedMap(Map)の違いは何ですか?
-
[解決済み] なぜJava 8のOptionalは引数で使ってはいけないのか
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
mvn' は、内部または外部のコマンド、操作可能なプログラムまたはバッチファイルとして認識されません。
-
Collections.sortがdoubleでソートできない問題を完璧に解決する。
-
が 'X-Frame-Options' を 'sameorigin' に設定したため、フレーム内に存在する。
-
名前 'XXX' を持つ Bean の作成に失敗しました。自動依存関係の注入に失敗しました 解決方法
-
java -jarコマンドでパッケージを実行すると、無効または破損したjarfile xxxx.jarが表示される。
-
java マイクロソフト払い戻し予期せぬサーバーからのファイルの終了
-
Junitのユニットテストはjava.lang.Testを報告します。
-
maven レポート エラー 解決不可能な親POM
-
org.xml.sax.SAXParseExceptionのエラー解決方法
-
htmlとwordの相互変換の実装(画像あり)