012 staticメンバ(staticメソッド) 003 解答例

public class MathUtils {
    // staticメソッド - 与えられた数が素数かどうかを判定するメソッド
    public static boolean isPrime(int number) {
        if (number <= 1) {
            return false;
        }
        for (int i = 2; i <= Math.sqrt(number); i++) {
            if (number % i == 0) {
                return false;
            }
        }
        return true;
    }

    // staticメソッド - 与えられた数の階乗を計算するメソッド
    public static int factorial(int number) {
        if (number == 0 || number == 1) {
            return 1;
        }
        return number * factorial(number - 1);
    }

    // staticメソッド - 与えられた数がフィボナッチ数列に含まれるかどうかを判定するメソッド
    public static boolean isInFibonacciSequence(int number) {
        if (number < 0) {
            return false;
        }
        int a = 0, b = 1;
        while (a <= number) {
            if (a == number) {
                return true;
            }
            int temp = a + b;
            a = b;
            b = temp;
        }
        return false;
    }
}

この解答例では、MathUtilsクラスに3つのstaticメソッドを実装しました。それぞれが素数判定、階乗計算、およびフィボナッチ数列の判定を行います。これらのメソッドを使用して異なる数値に対して動作をテストしてみてください。

参考:SimpleDataFormatクラス

staticメソッド

staticメソッドは、Javaプログラミング言語においてクラスレベルで定義されるメソッドであり、特定のインスタンスに紐付かない形で呼び出されます。以下に、staticメソッドに関する主な特徴と解説を示します。

  1. インスタンス不要:
    • staticメソッドは特定のインスタンスに紐付かないため、クラスのインスタンスを生成せずに呼び出せます。
    • 例: ClassName.staticMethod();
  2. クラスメソッド:
    • staticメソッドは通常、クラス自体に属するクラスメソッドとして宣言されます。
    • インスタンスメソッドとは異なり、オブジェクトの生成なしにクラス名を使用して直接アクセスできます。
  3. インスタンス変数にアクセスできない:
    • staticメソッド内では、同じクラス内のstaticメソッドstatic変数にはアクセスできますが、通常のインスタンス変数やメソッドにはアクセスできません。
    • thisキーワードを使用できません。
  4. 非staticメンバにアクセスできない:
    • staticメソッド内では、thisを使って自分自身のインスタンスを参照することはできません。
    • thisはインスタンスメソッド内でのみ有効です。
  5. メモリ効率:
    • staticメソッドはオブジェクトの生成なしに呼び出せるため、インスタンスに依存しない処理や、共通の処理を提供するのに適しています。
  6. クラスロード時に初期化:
    • staticメソッドstatic変数はクラスがロードされる際に初期化されます。
    • クラスが初めて使われる瞬間に1回だけ初期化され、その後は再初期化されません。
  7. static import:
    • staticメソッドimport static文を使用して、クラス名を省略して直接メソッドを呼び出すことができます。

以下は、staticメソッドの例です。

public class ExampleClass {
    // staticメソッド
    public static void staticMethod() {
        System.out.println("This is a static method.");
    }

    // クラスメソッドからstaticメソッドの呼び出し
    public static void main(String[] args) {
        staticMethod();  // 直接クラス名を使用してstaticメソッドを呼び出す
        ExampleClass.staticMethod();  // 同じ結果を得るためにクラス名を指定しても可
    }
}

staticメソッドは、特定のオブジェクトの状態に依存せず、共通の処理を提供する際に有用です。

staticメソッドの応用:ユーティリティクラス

staticメソッドの応用の一例として、ユーティリティクラスが挙げられます。ユーティリティクラスは、共通の機能や処理を提供するためのクラスであり、その中でstaticメソッドが頻繁に使用されます。

以下は、ユーティリティクラスの例として、日付操作に関するDateUtilsクラスを考えてみましょう。

import java.text.SimpleDateFormat;
import java.util.Date;

public class DateUtils {
    // インスタンス化を防ぐためにprivateなコンストラクタを持つ(ユーティリティクラスの慣習)
    private DateUtils() {
        // インスタンス生成を防ぐ
    }

    // staticメソッド - 現在の日付を指定されたフォーマットで取得する
    public static String getCurrentDate(String format) {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.format(new Date());
    }

    // staticメソッド - 2つの日付の差を日単位で取得する
    public static long getDaysDifference(Date date1, Date date2) {
        long difference = date2.getTime() - date1.getTime();
        return difference / (1000 * 60 * 60 * 24);
    }
}

このDateUtilsクラスは、インスタンスを生成せずに利用できるようにstaticメソッドを提供しています。具体的な使い方は以下の通りです。

public class Main {
    public static void main(String[] args) {
        // staticメソッドを使用して現在の日付を取得
        String currentDate = DateUtils.getCurrentDate("yyyy-MM-dd HH:mm:ss");
        System.out.println("Current Date: " + currentDate);

        // staticメソッドを使用して2つの日付の差を取得
        Date date1 = new Date();
        Date date2 = new Date(System.currentTimeMillis() + (1000 * 60 * 60 * 24 * 5)); // 5日後の日付
        long daysDifference = DateUtils.getDaysDifference(date1, date2);
        System.out.println("Days Difference: " + daysDifference);
    }
}

この例では、DateUtilsクラスがユーティリティメソッドを提供し、これらのメソッドを利用することで、日付に関する一般的な処理を実現しています。ユーティリティクラスは一般的にstaticメソッドを多く含むため、staticメソッドの応用として非常に一般的です。

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