012 staticメンバ(static変数) 001 解答例

public class SimpleCounter {
    // static変数 - カウントされた回数を表す変数
    private static int totalCount = 0;

    // インスタンス変数 - インスタンスごとのカウントを表す変数
    private int instanceCount;

    // コンストラクタ - インスタンス変数の初期化
    public SimpleCounter() {
        // 新しいインスタンスが生成されるたびにtotalCountを増やし、instanceCountを初期化
        totalCount++;
        instanceCount = 0;
    }

    // インスタンスメソッド - 新しいインスタンスが生成されるたびにカウントを増やすメソッド
    public void incrementInstanceCount() {
        // インスタンスごとのカウントを増やす
        instanceCount++;
    }

    // クラスメソッド - カウントされた回数を取得するメソッド
    public static int getTotalCount() {
        return totalCount;
    }

    // インスタンスメソッド - インスタンスごとのカウントを取得するメソッド
    public int getInstanceCount() {
        return instanceCount;
    }

    public static void main(String[] args) {
        // テスト
        SimpleCounter counter1 = new SimpleCounter();
        counter1.incrementInstanceCount();

        SimpleCounter counter2 = new SimpleCounter();
        counter2.incrementInstanceCount();
        counter2.incrementInstanceCount();

        System.out.println("Total Count: " + SimpleCounter.getTotalCount()); // 2
        System.out.println("Counter 1 Instance Count: " + counter1.getInstanceCount()); // 1
        System.out.println("Counter 2 Instance Count: " + counter2.getInstanceCount()); // 2
    }
}

このクラスを使って、mainメソッド内でテストが行われています。各インスタンスが生成されるたびにtotalCountが増え、incrementInstanceCountメソッドが呼ばれるとinstanceCountが増えることが確認できます。

static変数

「static変数」は、Javaにおいてクラスレベルでの変数のことを指します。これは、特定のインスタンスに紐づかず、クラス自体に関連付けられた変数です。以下は、static変数に関する主な特徴と解説です。

  1. クラスレベルの変数:
    • static変数は、クラス全体に1つだけ存在し、全てのインスタンスで共有されます。
    • インスタンスを生成せずにクラス名を使ってアクセスできます。
  2. クラスがロードされるタイミングで初期化:
    • static変数は、クラスがロードされる際に初期化されます。
    • クラスが初めて使われる瞬間に1回だけ初期化され、その後は再初期化されません。
  3. 静的メンバとして宣言:
    • static変数は通常、static修飾子を使用してクラス内で宣言されます。
    • 例: private static int totalCount;
  4. インスタンスを介さずにアクセス:
    • static変数は特定のインスタンスに紐づかないため、インスタンスを生成せずにクラス名を使って直接アクセスできます。
    • 例: ClassName.staticVariable;
  5. 共有データの保存:
    • 複数のインスタンスが同じデータを共有する必要がある場合、static変数を使用することで効果的にデータを共有できます。
  6. 静的メソッドとの組み合わせ:
    • static変数は通常、同じくstaticメソッドと組み合わせて使用され、クラス全体で共有されるデータや機能を提供します。

以下は、簡単な例です。

public class ExampleClass {
    // static変数
    private static int instanceCount = 0;

    // コンストラクタ
    public ExampleClass() {
        instanceCount++;
    }

    // 静的メソッドでstatic変数にアクセス
    public static int getInstanceCount() {
        return instanceCount;
    }
}

この例では、instanceCountstatic変数として宣言されており、ExampleClassの全てのインスタンスで共有されます。

private変数の応用:定数クラス

private変数を使用して定数を管理するクラスを作成することは、プログラム内で共通の値を効果的に管理する手段の一つです。このアプローチは、定数クラス(Constantsクラス)として知られています。定数クラスには、private変数を使用して定数を宣言し、それに対するアクセスメソッドを提供します。

以下に、private変数を使用した定数クラスの例を示します。

public class Constants {
    // private変数 - 定数を宣言
    private static final int MAX_RETRY_COUNT = 3;
    private static final String DEFAULT_USERNAME = "guest";
    private static final double PI = 3.141592653589793;

    // privateコンストラクタ - インスタンス化を防ぐ
    private Constants() {
        // インスタンス生成を防ぐ
    }

    // アクセスメソッド - MAX_RETRY_COUNTにアクセスするメソッド
    public static int getMaxRetryCount() {
        return MAX_RETRY_COUNT;
    }

    // アクセスメソッド - DEFAULT_USERNAMEにアクセスするメソッド
    public static String getDefaultUsername() {
        return DEFAULT_USERNAME;
    }

    // アクセスメソッド - PIにアクセスするメソッド
    public static double getPI() {
        return PI;
    }
}

このConstantsクラスでは、private変数として3つの定数を宣言しています。これらの変数はstatic修飾子を使用してクラスレベルのものにしています。また、privateコンストラクタを持っているため、このクラスのインスタンス化を防ぎ、常にstaticメソッドを介してアクセスします。

アクセスメソッドを通じて外部からこれらの定数にアクセスできるため、他のクラスからこれらの定数を使いたい場合、クラス内のロジックを知る必要はなく、簡単に値を取得できます。

この定数クラスのパターンは、プロジェクト全体で共通の設定や定数を効果的に管理する際に利用されます。

「012 staticメンバ」問題集リスト