24
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

Java入門 パッケージ管理

Java入門
パッケージ

前回はソースコードの分割をやりました。コード自体はスッキリとして保守性は高くなりますが、プロジェクトによってはクラスの数が膨大になり、かえって保守性が悪くなることがあります。それを防ぐために、Javaにはクラスをパッケージというグループに分けて管理できる仕様になっています。
クラスをパッケージに所属させるにはソースコードの先頭部分にpackage文を記入します。

package 所属させるパッケージ名;

前回のソースコードを編集してみます。

sample.java
// calcurator.mainパッケージに所属させる
package calculator.main;

public class Sample {
    public static void main(String[] args) {
        int a = 5;
        int b = 2;

        int subAnswer = calculator.method.Calculator.subtraction(a, b);
        int addAnswer = calculator.method.Calculator.add(a, b);

        System.out.println("5 + 2 = " + addAnswer);
        System.out.println("5 -  2 = " + subAnswer);
    }
}
calculator.java
// calculator.methodパッケージに所属させる
package calculator.method;
// 計算するクラス
public class Calculator {
    // 引き算メソッド
    public static int subtraction(int x, int y) {
        int answer = x - y;

        return answer;
    }
    // 足し算メソッド
    public static int add(int x, int y) {
        int answer = x + y;

        return answer;
    }
}

mainメソッドがあるクラスをcalculator.mainパッケージ
calculatorメソッドがあるクラスをcalculator.methodパッケージに所属させました。

パッケージ名は自由に指定できますが、小文字が基本です。

また、mainメソッドの各メソッドの呼び出しにも変更を加えました。呼び出すメソッドのパッケージ名もドット演算子で指定して上げる必要があります。
このように、クラス名を指定することを完全限定名【FQCN】といいます。

パッケージを使う理由

最初の方に、パッケージはクラスを管理するのに便利と書きましたが、他にも使うメリットはあるんです。
唐突ですがクラス名の重複はダメです。たとえ処理が違っていたとしても許されません。一人で開発する分には恐らくそのような問題は起きないと思いますが、これが大人数で開発するとなると被る可能性は大です。
しかし、パッケージが異なればクラス名が被ってもいいんです!FQCNが異なれば、クラスの区別は可能だからです。

例えば、同じ学校に同姓同名が何人か居たとしても、学年と組で区別できますよね?それと同じです。

さて、ここで新しい問題が出てきました。パッケージ名が被る可能性だってあるじゃないか!
しかし、それを防ぐためにパッケージ名はあるルールが推奨されています。
それが、保有するインターネットドメインを前後逆順にしたものから始めることです。

例えば、http://oukokumin.jpというドメインを持っていたら。

推奨されるパッケージ名
jp.oukokumin

 

これから始まるパッケージ名を使えばいいのです。

jp.oukokumin.main;
jp.oukokumin.calculator;

などです。

FQCNの省略

ここまで部分化したソースをパッケージに所属させるという効率的なことをやってきました。
ただ毎回FQCNで指定するのはめんどくさくないですか?
なんだか本末転倒な気がしないでもないです。

実はこれ省略することができるんです。それがimportです!
これはあくまで省略機能なので、C言語でつかうincludeとは意味合いが違ってきます。

sample.java
// calcurator.mainパッケージに所属させる
package calculator.main;
import calculator.method.Calculator;

public class Sample {
    public static void main(String[] args) {
        int a = 5;
        int b = 2;

        int subAnswer = Calculator.subtraction(a, b);
        int addAnswer = calculator.method.Calculator.add(a, b);

        System.out.println("5 + 2 = " + addAnswer);
        System.out.println("5 -  2 = " + subAnswer);
    }
}

calculator.method.Calculator;をimportしました。subtractionを見て下さい。FQCNが省略されています。addは比較のためにあえてFQCNを記述しています。

ここで注意なのですがimport文はpackage文の下に書いて下さい。上に書くとエラーが出ます。
今回は、calculator.methodパッケージ内のCalculatorクラスをimportしていますが
パッケージに所属するすべてのクラスをimportするには

import calculator.method.*;

これでcalculator.methodパッケージに所属するすべてのクラスをimportします。

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
24
Help us understand the problem. What are the problem?