はい、パッケージごとにワイルドカード インポートを行う必要があります。
なんで?JLSに関する限り、「com.example」と「com.example.pkg」は無関係のパッケージです。サブパッケージの概念は JLS で言及されていますが、関連するセマンティックはありません。特に「アクセス」ルールにはありません。 JLS 7.1は次のように述べています。
「パッケージの階層的な命名構造は、従来の方法で関連するパッケージを整理するのに便利であることを目的としていますが、トップレベルの型と同じ単純な名前を持つサブパッケージを持つパッケージを禁止すること以外には意味がありません (§7.6 ) そのパッケージで宣言されています。
たとえば、 という名前のパッケージと という名前oliver
の別のパッケージoliver.twist
の間、または とevelyn.wood
という名前のパッケージの間に特別なアクセス関係はありませんevelyn.waugh
。つまり、という名前のパッケージ内のコードは、他のパッケージ内のコードよりも、oliver.twist
パッケージ内で宣言された型にうまくアクセスできません。」oliver
(そして、関連のない多数のパッケージのインポートを許可する構造は、悪い結果をもたらします...以下を参照してください。)
しかし、なぜ?それが言語の設計方法だからです。
しかし、なぜ?Java 言語の設計チームに、設計に関する決定が下された 1990 年代初頭に彼らがどのような考えを持っていたかを尋ねる必要があります。
しかし、複数パッケージのワイルドカード インポートがあった場合に何が起こるかを確認できるかもしれません。
非常に一般的なパターンであるこのパッケージ構造を考えてみましょう。
com.example.weazellib - contains the public API classes for the library
com.example.weazellib.impl - contains implementation classes that
shouldn't be used by external clients
プログラマーが怠け者であることはよく知られている事実です (多くの人はそうです)。
import com.example.weazellib.** // hypothetical syntax
彼/彼女は、このクラス名前空間に外部 API クラスと内部クラスの両方を持つことになり、誤って内部クラスへの依存関係を作成しやすくなります。
(そして、「内部クラスのパッケージをプライベートにする」と言う前に...それは機能しません。のクラスcom.example.weazellib
を使用できるようにする必要があるクラスが にありcom.example.weazellib.impl
ます。後者がパッケージをプライベートにした場合、前者はできません。それらを使用します。)
対照的に、Java にパッケージ「ツリー」をインポートするワイルドカードがない世界では、誤ってそれを行うことはできません。意図的impl
にパッケージをインポートする必要があります。これは良いことであり、複数のパッケージに対してワイルドカード インポートを記述することの「不便さ」よりもはるかに重要です。
もう 1 つの問題は、ワイルドカード インポートは長期的なソース コードの安定性に適しておらず、スーパー ワイルドカードを使用するとさらに悪化することです。
プログラマーが と の両方をインポートすることcom.example.weazellib
がcom.example.weazellib.impl
彼のコードで行うべき正しいことであると判断し、スーパーワイルドカードを使用して両方をインポートするとします。com.example.weazellib.impl.ToesImpl
そして、彼が... asを使用するコードを書いたとしますToesImpl
。
com.example.weazellib.impl2
ここで、"weazellib" 開発者が代替実装クラスを含む3 番目のパッケージを追加するとどうなるかを考えてみてくださいimpl
。たとえば、次のようなクラスがあります。
com.example.weazellib.impl.ToesImpl
com.example.weazellib.impl2.ToesImpl
何が起こるのですか?さて、プログラマーのコードにはコンパイルエラーがあります。 ToesImpl
あいまいです...以前は存在しなかったパッケージからクラス名を取得するスーパーワイルドカードインポートの影響のためです。
通常のワイルドカード インポートにも同じ問題が存在することに注意してください。多くの人がワイルドカード インポートを使用しないのはそのためです。しかし、スーパーワイルドカードが問題をさらに悪化させることは間違いありません。