#パッケージとは
- クラス/インターフェースなどの所属のこと
- 完全修飾名(Fully qualified name):名前空間まで加味した名前
-
package命令で宣言
- ファイルの先頭に一度のみ記述
- 以降のクラス、インターフェースは全部そのパッケージに属する
- パッケージの役割
- 型を分類し名前を識別する
-
機能的な分類
- java.textパッケージ:テキスト/日付/数値の加工クラス:
- java.sqlパッケージ:SQLに関わるクラス
-
アクセス制御の単位
- 適切な単位でパッケージを定義すると外部に対し余計な情報を隠蔽できる
##命名ルール
-
階層構造は
.
で表すpackage com.example.neko.object;
-
パッケージ名は小文字に設定
- 先頭大文字のクラス名が視認しやすい
- パッケージの各階層要素(.で区切られた部分)とクラス/インターフェースの単純名は同じ名前空間を共有
-
ドメイン名を元に命名
- パッケージ接頭辞にインターネットドメインを逆順にしたものを付与
- ドメインは一意であるのでパッケージ名も衝突しない
- パッケージ階層とファイルシステム階層は対応関係にある
デフォルトパッケージ
- 名前なしパッケージ
- package宣言を省略した場合、配下クラスはデフォルトパッケージに属する
- 名前衝突の可能性があるので避けたい
##名前解決
- import命令で完全修飾名を単純名で表記可能
import com.example.neko.object.Animal;
Animal animal = new Animal();
- importが取り込むのは名前解決情報
- クラスファイルそのものを取り込むのではないのでクラスファイルが肥大化するわけではない
- インポート先のクラスが更新されてもインポート元クラスを再コンパイルする必要はない
##インポート種類
-
単一型インポート
import java.util.Map;
-
オンデマンドインポート
import java.util.*;
- パッケージ配下の全部の型をインポート
- 注:java.util.regex、java.util.streamなどのパッケージがインポートされるのではなくjava.utilパッケージのみインポートされる
- java.util、java.util.regexは互いにフラットな関係
-
単一型インポートのメリット
-
名前解決の優先順位が異なる
- 優先型順序
- 1.現在ファイルで定義された型
- 2.単一インポート型
- 3.同一パッケージ型
- 4.オンデマンドインポート型
- 自分で定義するときは標準ライブラリの型名と重複しないように注意しよう
- 優先型順序
- クラスとパッケージの関係を視認しやすい
-
名前解決の優先順位が異なる
##staticインポート
import static 完全修飾名
- パッケージのみでなくクラス、構造体、列挙体などの型も略記できるようになる
- 頻繁に使う静的メソッド/定数/staticメンバークラスでシンプルにかける
import static java.lang.Math.abs;
//Mathクラス配下の全静的メソッドがstaticインポートされる
//import static java.lang.Math.*;
public class ImportStatic {
public static void main(String[] args) {
System.out.println(abs(-10));
}
}