JavaでLBYLとEAFPの比較?
質問
私は最近Pythonを独学で学んでいて、コード実行前のエラーチェックに関してLBYL/EAFPイディオムを発見しました。Pythonでは、受け入れられたスタイルはEAFPであり、それは言語とうまく動作するように思われます。
LBYL ( L オク B 前 Y ou L eap ):
def safe_divide_1(x, y):
if y == 0:
print "Divide-by-0 attempt detected"
return None
else:
return x/y
EAFP ( それは E よりも A スキップ F より強い P 許可 ):
def safe_divide_2(x, y):
try:
return x/y
except ZeroDivisionError:
print "Divide-by-0 attempt detected"
return None
私の質問はこれです。JavaとC++のバックグラウンドを持つ私は、主なデータ検証コンストラクトとしてEAFPを使用することを聞いたことすらありませんでした。EAFP は Java で使用するのが賢明なのでしょうか。それとも、例外によるオーバーヘッドが大きすぎるのでしょうか?実際に例外がスローされたときだけオーバーヘッドがあることは知っていますが、なぜよりシンプルな方法のEAFPが使用されないのかがわかりません。単なる好みなのでしょうか?
どのように解決するのですか?
個人的には、これは慣習に裏打ちされたものだと思いますが、EAFPは決して良い方法とは言えません。 以下と同等と見てよいでしょう。
if (o != null)
o.doSomething();
else
// handle
とは対照的に
try {
o.doSomething()
}
catch (NullPointerException npe) {
// handle
}
さらに、次のように考えてみましょう。
if (a != null)
if (b != null)
if (c != null)
a.getB().getC().doSomething();
else
// handle c null
else
// handle b null
else
// handle a null
この方法は、見た目はあまりよくありませんが(確かにこれは雑な例ですが、我慢してください)、エラー処理の粒度が大きくなり、try-catchですべてを包んで、このような
NullPointerException
を取得し、どこで、なぜそれを取得したかを理解しようとするのとは対照的です。
私が考えるに、EAFPはまれな状況を除いて、決して使われてはならないのです。また、問題を提起されたので はい、try-catch ブロックはいくらかのオーバーヘッドを発生させます。 例外がスローされない場合でもです。
関連
-
org.xml.sax.SAXParseExceptionのエラー解決方法
-
Spring Bootは、Tomcatの組み込みのmaxPostSizeの値を設定します。
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み】Javaではfinallyブロックは必ず実行されるのですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
アクセス制限です。タイプ 'JPEGCodec' は API ではない ☞My Blog Github ☜ ホームページを見る
-
メモ帳でJavaプログラムをコンパイルして実行すると、Could not find or load main class ...というエラーが表示される。解決方法
-
java -jarコマンドでパッケージを実行すると、無効または破損したjarfile xxxx.jarが表示される。
-
Junitのユニットテストはjava.lang.Testを報告します。
-
Java基礎編 - オブジェクト指向
-
ecplise プロンプトが表示されます。"選択したものは起動できません。" "最近の起動はありません。"
-
Java JDKのダイナミックプロキシ(AOP)の使用と実装の原理分析
-
ApiModel と @ApiModelProperty の使用法
-
[解決済み] C言語でファイルが存在するかどうかを確認する最も良い方法は何ですか?
-
[解決済み】ネストされたJavaScriptオブジェクトのキーが存在するかどうかをテストする