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メソッド
を実装しました。それぞれが素数判定、階乗計算、およびフィボナッチ数列の判定を行います。これらのメソッドを使用して異なる数値に対して動作をテストしてみてください。
staticメソッド
staticメソッド
は、Javaプログラミング言語においてクラスレベルで定義されるメソッドであり、特定のインスタンスに紐付かない形で呼び出されます。以下に、staticメソッド
に関する主な特徴と解説を示します。
- インスタンス不要:
staticメソッド
は特定のインスタンスに紐付かないため、クラスのインスタンスを生成せずに呼び出せます。- 例:
ClassName.staticMethod();
- クラスメソッド:
staticメソッド
は通常、クラス自体に属するクラスメソッドとして宣言されます。- インスタンスメソッドとは異なり、オブジェクトの生成なしにクラス名を使用して直接アクセスできます。
- インスタンス変数にアクセスできない:
staticメソッド
内では、同じクラス内のstaticメソッド
やstatic変数
にはアクセスできますが、通常のインスタンス変数やメソッドにはアクセスできません。this
キーワードを使用できません。
- 非staticメンバにアクセスできない:
staticメソッド
内では、this
を使って自分自身のインスタンスを参照することはできません。this
はインスタンスメソッド内でのみ有効です。
- メモリ効率:
staticメソッド
はオブジェクトの生成なしに呼び出せるため、インスタンスに依存しない処理や、共通の処理を提供するのに適しています。
- クラスロード時に初期化:
staticメソッド
やstatic変数
はクラスがロードされる際に初期化されます。- クラスが初めて使われる瞬間に1回だけ初期化され、その後は再初期化されません。
- 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メソッド
の応用として非常に一般的です。