[解決済み] メソッドの静的インポートの良い使用例とは?
質問
私のメソッドの静的インポートが良いアイデアではなかったというレビューコメントをもらったところです。静的インポートは、ほとんどが静的メソッドであるDAクラスからのメソッドのものでした。そのため、ビジネスロジックの途中で、明らかに現在のクラスに属しているように見えるdaアクティビティがありました。
import static some.package.DA.*;
class BusinessObject {
void someMethod() {
....
save(this);
}
}
レビュアーは私がコードを変更することに熱心ではなかったので、変更しませんでしたが、私は彼の意見にちょっとだけ同意します。静的インポートをしなかった理由のひとつは、メソッドがどこで定義されているのかがわかりにくかったからです。現在のクラスにも、どのスーパークラスにもなかったので、その定義を特定するのに時間がかかりました(WebベースのレビューシステムはIDEのようにクリックできるリンクを持っていません:-)私はこれが重要だとは思いません。
しかし、もう一つの理由は、私が同意するものですが、非限定メソッドコールは現在のオブジェクトに属しているようで、コンテキストをジャンプすべきではないということです。しかし、もしそれが本当に所属しているのであれば、そのスーパークラスを拡張することは理にかなっているはずです。
ということは が行います。 メソッドを静的にインポートすることは意味があるのでしょうか?あなたはいつそれを実行しましたか?修飾されていない呼び出しの見た目が好きでしたか/好きですか?
EDIT: 一般的な意見としては、誰も現在のクラスのメソッドと混同しないのであれば、スタティック・インポート・メソッドを使うべきとされているようです。例えば、java.lang.Mathやjava.awt.Color.Mathのメソッドは、静的インポートが可能です。しかし、absとgetAlphaが曖昧でないなら、なぜreadEmployeeが曖昧なのか分かりません。多くのプログラミングの選択と同様に、これも個人的な好みの問題だと思います。
どのように解決するのか?
これは、この機能をリリースしたときのSunのガイドからです(強調は原文のまま)。
<ブロッククオートでは、どのような場合にstatic importを使うべきなのでしょうか? 非常に控えめに 定数のローカル・コピーを宣言したり、継承を悪用するような場合(Constant Interface Antipattern)にのみ使用してください ... 静的インポート機能を使い過ぎると、プログラムが読めなくなり、メンテナンスもできなくなります。あなたのコードを読む人(書いた数ヶ月後のあなたも含めて)は、ある静的メンバがどのクラスから来ているのかわからなくなるでしょう。あるクラスからすべての静的メンバをインポートすると、特に可読性を損ないます。1つか2つのメンバしか必要ない場合は、個別にインポートしましょう。
( https://docs.oracle.com/javase/8/docs/technotes/guides/language/static-import.html )
特に呼びかけたい部分が2つあります。
-
静的インポートを使用する
のみ
継承を悪用したくなったとき。この場合、BusinessObjectの
extend some.package.DA
? もしそうなら、静的インポートの方がきれいに処理できるかもしれません。を拡張することなど考えもしなかったのであれば、静的インポートの方がすっきりしています。some.package.DA
これはおそらく、静的インポートの悪い使い方でしょう。入力時の文字数を節約するためだけに使用するのはやめましょう。 -
個々のメンバーをインポートする。
言う
import static some.package.DA.save
ではなくDA.*
. そうすれば、このインポートされたメソッドがどこから来ているのか、より簡単に見つけることができます。
個人的には、この言語機能 非常に また、ほとんど常に定数または列挙型のみで、メソッドでは使用したことがありません。このトレードオフは、私にとっては、ほとんど価値がありません。
関連
-
あるコードに出会いましたが、何に使うのか理解できません。 List<String> list = new ArrayList<String>() { { a
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] 整数の平方根が整数であるかどうかを判断する最速の方法
-
[解決済み] 静的メソッドを使用する場合
-
[解決済み] Javaインターフェースでスタティックメソッドを定義できないのはなぜですか?
-
[解決済み] import」の後の「static」モディファイアは何を意味するのですか?
-
[解決済み】Android UserManager.isUserAGoat()の正しい使用例?)
-
[解決済み】KotlinでJavaの静的メソッドに相当するものは何ですか?
-
[解決済み】静的初期化コードブロックと非静的初期化コードブロックの違いは何ですか?
-
[解決済み】プライベートヘルパーメソッドはstaticにできるのであればstaticにするべき
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
Java エラー報告 スレッド "main" での例外 java.util.NoSuchElementException
-
スタイルが読み込まれず、ブラウザコンソールでエラーが報告される。リソースはスタイルシートとして解釈されますが、MIMEタイプtext/htmlで転送されます。
-
IllegalArgumentException この例外を解決する方法
-
javaの実行中に「javaの例外が発生しました」と表示された場合はどうすればよいですか?
-
eclipse アクセス制限です。タイプ 'xxx' は API ではありません(必須ライブラリ '' の制限)。
-
コンストラクタの呼び出しは、コンストラクタのエラー理解の最初のステートメントである必要があります。
-
プロローグでのコンテンツは禁止されています
-
JQuery DataTable 详解
-
Eclipseプロンプトを実行する java仮想マシンを使用しない
-
java 例外。Javaツールの初期化