Javaインターフェースと内部クラスの実践的理解

インターフェースの基本概念

Javaでは単一継承の制限を克服するため、インターフェースが導入されています。クラスは一つまたは複数のインターフェースを実装できます。

インターフェースはクラスではなく、定数と抽象メソッドの集合からなる仕様です。変数や実装済みメソッドは含まれません。インターフェースを実装したクラスは、その形式に従って定義され、インターフェースが必要な場所で使用できます。

public interface DataProcessor {
    double PROCESS_FACTOR = 1.05;
    void processData();
}

class ReportGenerator implements DataProcessor {
    public void processData() {
        System.out.println("データ処理完了: " + PROCESS_FACTOR);
    }
}

インターフェースの拡張

インターフェースは継承関係のように拡張できます:

public interface AdvancedProcessor extends DataProcessor {
    void validateData();
}

インターフェースと抽象クラスの比較

  • インターフェースはメソッド実装を持てないが、抽象クラスは持てる
  • クラスは複数インターフェースを実装できるが、単一継承のみ
  • インターフェースはクラス階層に属さない

コールバックとタイマー

コールバックは特定のイベント発生時の動作を定義するプログラミングパターンです:

import javax.swing.Timer;

public class EventScheduler {
    public static void main(String[] args) {
        ActionListener handler = new EventHandler();
        Timer timer = new Timer(5000, handler);
        timer.start();
    }
}

class EventHandler implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        System.out.println("イベント発生: " + new Date());
    }
}

オブジェクトクローニング

Objectクラスのcloneメソッドを使用してオブジェクトのコピーを作成します。

シャローコピーとディープコピー

  • シャローコピー:基本型はコピーされるが、オブジェクト参照は元のオブジェクトを指す
  • ディープコピー:すべてのオブジェクトも再帰的にコピーされる
public class DataRecord implements Cloneable {
    private String id;
    private Date timestamp;
    
    public DataRecord clone() throws CloneNotSupportedException {
        DataRecord cloned = (DataRecord) super.clone();
        cloned.timestamp = (Date) timestamp.clone();
        return cloned;
    }
}

Lambda式の活用

Java 8で導入されたLambda式は関数型プログラミングを簡潔にします:

String[] cities = {"Tokyo", "Osaka", "Nagoya", "Fukuoka"};
Arrays.sort(cities, (s1, s2) -> s1.length() - s2.length());

Timer timer = new Timer(2000, event -> 
    System.out.println("現在時刻: " + new Date()));
timer.start();

内部クラスの種類と用途

通常の内部クラス

class SensorMonitor {
    private int samplingRate;
    
    class DataCollector implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            System.out.println("サンプリングレート: " + samplingRate);
        }
    }
}

匿名内部クラス

ActionListener listener = new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        System.out.println("匿名クラス処理完了");
    }
};

静的内部クラス

class MathUtils {
    public static class Range {
        private double min, max;
        public Range(double min, double max) {
            this.min = min;
            this.max = max;
        }
    }
    
    public static Range findRange(double[] data) {
        double minVal = Double.MAX_VALUE;
        double maxVal = Double.MIN_VALUE;
        for(double val : data) {
            if(val < minVal) minVal = val;
            if(val > maxVal) maxVal = val;
        }
        return new Range(minVal, maxVal);
    }
}

実践的なデータ処理アプリケーション

個人情報管理システムの実装例:

public class Person implements Comparable<Person> {
    private String fullName;
    private String idNumber;
    private int personAge;
    private String gender;
    private String address;
    
    public int compareTo(Person other) {
        return this.fullName.compareTo(other.fullName);
    }
}

public class PersonManager {
    private ArrayList<Person> personDatabase;
    
    public ArrayList<Person> findSimilarAge(int targetAge) {
        int minDiff = Integer.MAX_VALUE;
        int closestIndex = 0;
        
        for(int i = 0; i < personDatabase.size(); i++) {
            int diff = Math.abs(personDatabase.get(i).getAge() - targetAge);
            if(diff < minDiff) {
                minDiff = diff;
                closestIndex = i;
            }
        }
        
        ArrayList<Person> result = new ArrayList<>();
        for(Person p : personDatabase) {
            if(p.getAge() == personDatabase.get(closestIndex).getAge()) {
                result.add(p);
            }
        }
        return result;
    }
}

タグ: Java インターフェース Lambda式 内部クラス オブジェクトクローニング

7月11日 22:44 投稿