#pragma twice

KAB-studio > プログラミング > Javaのオブジェクト指向入門 > 3. メソッドで操作しよう > 3.4 フィールドを守ろう!
 
前のページへつぎ

3.4 フィールドを守ろう!

del.icio.us 登録する はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数 livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数 Yahoo!ブックマーク 詳細を表示 users RSSに登録
更新日: 2008/03/31
動作確認環境:Windows XP Professional SP2, Java SE 5

 これまではフィールドを直接扱ってきましたが、実は「フィールドを外から守る」のが正しい作法です。

publicとprivate

 フィールドとメソッドには「外から使えない」ようにする設定があります。

// PublicOrPrivateFieldRunner.java

/**
 * フィールド2つを持つクラス。
 */
class PublicOrPrivateField
{
    // int型変数のフィールドです。publicです。
    public int dataPublic;
    // int型変数のフィールドです。privateです。
    private int dataPrivate;

    /**
     * dataフィールドを出力するメソッドです。
     */
    public void printData()
    {
        // dataPublicフィールドを使用します。
        System.out.println( dataPublic );
        // dataPrivateフィールドを使用します。
        System.out.println( dataPrivate );
        // 自クラスのメソッドからならprivateフィールドも
        // 使うことができます。
    }
}

/**
 * 実行用クラス。このクラスを実行してください。
 */
class PublicOrPrivateFieldRunner
{
    public static void main( String[] args )
    {
        // PublicOrPrivateFieldクラスの参照型変数とインスタンスを作ります。
        PublicOrPrivateField ref = new PublicOrPrivateField();

        // dataPublicフィールドに数値を入れます。
        // publicフィールドなので外から使えます。
        ref.dataPublic = 100;

        // dataPrivateフィールドに数値を入れます。
        // ref.dataPrivate = 100;
        // コンパイルエラー:
        // PublicOrPrivateFieldRunner.java:40: 
        // dataPrivate は PublicOrPrivateField で private アクセスされます。

        // printData()メソッドを呼び出します。
        ref.printData();
        // 出力結果:
        // 100
        // 0

        // 注:
        // フィールドは自動的に0が入れられるので0が出力されます。
    }
}
// PublicOrPrivateFieldRunner.java
/**
 * フィールド2つを持つクラス。
 */
class PublicOrPrivateField
{
	// int型変数のフィールドです。publicです。
	public int dataPublic;
	// int型変数のフィールドです。privateです。
	private int dataPrivate;
	/**
	 * dataフィールドを出力するメソッドです。
	 */
	public void printData()
	{
		// dataPublicフィールドを使用します。
		System.out.println( dataPublic );
		// dataPrivateフィールドを使用します。
		System.out.println( dataPrivate );
		// 自クラスのメソッドからならprivateフィールドも
		// 使うことができます。
	}
}
/**
 * 実行用クラス。このクラスを実行してください。
 */
class PublicOrPrivateFieldRunner
{
	public static void main( String[] args )
	{
		// PublicOrPrivateFieldクラスの参照型変数とインスタンスを作ります。
		PublicOrPrivateField ref = new PublicOrPrivateField();
		// dataPublicフィールドに数値を入れます。
		// publicフィールドなので外から使えます。
		ref.dataPublic = 100;
		// dataPrivateフィールドに数値を入れます。
		// ref.dataPrivate = 100;
		// コンパイルエラー:
		// PublicOrPrivateFieldRunner.java:40: 
		// dataPrivate は PublicOrPrivateField で private アクセスされます。
		// printData()メソッドを呼び出します。
		ref.printData();
		// 出力結果:
		// 100
		// 0
		// 注:
		// フィールドは自動的に0が入れられるので0が出力されます。
	}
}

 このプログラムのPublicOrPrivateFieldクラスは、前ページのHasMethodAndFieldクラスとほとんど同じです。
 HasMethodAndFieldクラスとの違いは、フィールドが2つあって、それぞれにpublicprivateが付いているという点です。

    // int型変数のフィールドです。publicです。
    public int dataPublic;
    // int型変数のフィールドです。privateです。
    private int dataPrivate;
	// int型変数のフィールドです。publicです。
	public int dataPublic;
	// int型変数のフィールドです。privateです。
	private int dataPrivate;

 dataPublicフィールドの前にはpublic(パブリック)が付いています。
 dataPrivateフィールドの前にはprivate(プライベート)が付いています。

 フィールドとメソッドには「どこから使えるのか」ということを指定する「アクセス修飾子」というものがあります。
 ここで使用しているpublicprivateがそのアクセス修飾子です。

 まず、dataPublicフィールドに付いているpublicから説明しましょう。
 publicを付けたフィールドやメソッドは、どこからでも使うことができます。

        // dataPublicフィールドに数値を入れます。
        // publicフィールドなので外から使えます。
        ref.dataPublic = 100;
		// dataPublicフィールドに数値を入れます。
		// publicフィールドなので外から使えます。
		ref.dataPublic = 100;

 dataPublicフィールドはpublicが付いているので、このようにこれまでと同じように使えます。

 次に、dataPrivateフィールドに付いているprivateについて説明しましょう。
 privateを付けたフィールドやメソッドは、外から使うことができません

        // dataPrivateフィールドに数値を入れます。
        ref.dataPrivate = 100;
        // コンパイルエラー:
        // PublicOrPrivateFieldRunner.java:40: 
        // dataPrivate は PublicOrPrivateField で private アクセスされます。
		// dataPrivateフィールドに数値を入れます。
		ref.dataPrivate = 100;
		// コンパイルエラー:
		// PublicOrPrivateFieldRunner.java:40: 
		// dataPrivate は PublicOrPrivateField で private アクセスされます。

 これまでは「参照型変数.フィールド」という形でフィールドを使うことができました。
 ところが、privateなフィールドはこの形で使用することができません
 逆に言えば、勝手に触れさせないようにすることができるということです。
 じゃあどこからなら使えるのか、というと「自クラスのメソッド」からなら使うことができます。

    /**
     * dataフィールドを出力するメソッドです。
     */
    public void printData()
    {
        // dataPublicフィールドを使用します。
        System.out.println( dataPublic );
        // dataPrivateフィールドを使用します。
        System.out.println( dataPrivate );
        // 自クラスのメソッドからならprivateフィールドも
        // 使うことができます。
    }
	/**
	 * dataフィールドを出力するメソッドです。
	 */
	public void printData()
	{
		// dataPublicフィールドを使用します。
		System.out.println( dataPublic );
		// dataPrivateフィールドを使用します。
		System.out.println( dataPrivate );
		// 自クラスのメソッドからならprivateフィールドも
		// 使うことができます。
	}

 printData()メソッドは、同じクラスのメソッドです。
 このメソッドからなら、privateなフィールドを使うことができます。なので、printData()メソッドからdataPrivateフィールドを使うことができます。
 また、当然publicなフィールドの、dataPublicフィールドも使えます。

 ようするに、privateにすれば「外から守れる」ということです。
 これが実は便利な機能だったりします。

「省略」とpublicは同じ?

 前ページまでは、publicやprivateといったアクセス修飾子を省略していました。
 アクセス修飾子を省略すると、使える範囲がpublicやprivateとも違う特殊な範囲となります。
 ここまでの例では特に問題がないため省略してきましたが、ここからの説明ではpublicやprivateを使用します。アクセス修飾子の省略は慣習的に勧められていないので、これからはpublicやprivateを必ず付けるようにしましょう。

3.4 フィールドを守ろう!
このページは、Java言語を用いたオブジェクト指向プログラミングのチュートリアル解説を行う「Javaのオブジェクト指向入門」の一ページです。
詳しい説明は「Javaのオブジェクト指向入門」目次をご覧ください。