1. ホーム
  2. java

[解決済み] メソッドの静的インポートの良い使用例とは?

2022-04-28 10:43:54

質問

私のメソッドの静的インポートが良いアイデアではなかったというレビューコメントをもらったところです。静的インポートは、ほとんどが静的メソッドである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.* . そうすれば、このインポートされたメソッドがどこから来ているのか、より簡単に見つけることができます。

個人的には、この言語機能 非常に また、ほとんど常に定数または列挙型のみで、メソッドでは使用したことがありません。このトレードオフは、私にとっては、ほとんど価値がありません。