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変数
に関する主な特徴と解説です。
- クラスレベルの変数:
static変数
は、クラス全体に1つだけ存在し、全てのインスタンスで共有されます。- インスタンスを生成せずにクラス名を使ってアクセスできます。
- クラスがロードされるタイミングで初期化:
static変数
は、クラスがロードされる際に初期化されます。- クラスが初めて使われる瞬間に1回だけ初期化され、その後は再初期化されません。
- 静的メンバとして宣言:
static変数
は通常、static
修飾子を使用してクラス内で宣言されます。- 例:
private static int totalCount;
- インスタンスを介さずにアクセス:
static変数
は特定のインスタンスに紐づかないため、インスタンスを生成せずにクラス名を使って直接アクセスできます。- 例:
ClassName.staticVariable;
- 共有データの保存:
- 複数のインスタンスが同じデータを共有する必要がある場合、
static変数
を使用することで効果的にデータを共有できます。
- 複数のインスタンスが同じデータを共有する必要がある場合、
- 静的メソッドとの組み合わせ:
static変数
は通常、同じくstatic
メソッドと組み合わせて使用され、クラス全体で共有されるデータや機能を提供します。
以下は、簡単な例です。
public class ExampleClass {
// static変数
private static int instanceCount = 0;
// コンストラクタ
public ExampleClass() {
instanceCount++;
}
// 静的メソッドでstatic変数にアクセス
public static int getInstanceCount() {
return instanceCount;
}
}
この例では、instanceCount
はstatic変数
として宣言されており、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
メソッドを介してアクセスします。
アクセスメソッドを通じて外部からこれらの定数にアクセスできるため、他のクラスからこれらの定数を使いたい場合、クラス内のロジックを知る必要はなく、簡単に値を取得できます。
この定数クラスのパターンは、プロジェクト全体で共通の設定や定数を効果的に管理する際に利用されます。