技術とか戦略とか

IT技術者が技術や戦略について書くブログです。

java:インターフェースを用いることでクラス毎の重複した記述を無くす

javaにはインターフェースという機能があります。
インターフェースとは、メソッドの仕様(メソッド名、戻り値、引数)のみを定義したものです。
インターフェース単独では処理を実行できませんが、そのインターフェースを実装したクラスを定義することで処理を実行可能になります。
 
インターフェースを利用するメリットとしては、重複した記述を無くせることがあります。
オブジェクトを参照する際にインターフェース名を指定することで、そのインターフェースを実装している全てのクラスを指すことができます。一つの記述で複数のクラスに対応させることができるので、クラスごとに同じ記述を行う必要が無くなり、保守性が向上します。
デザインパターンでもインターフェースは良く使われます)
 
言葉だと通じにくいと思うので、サンプルコードを用意しました。
 
【サンプルコード】
・FinancialProducts.java
package lesson1;

/* 金融商品(インターフェース) */
public interface FinancialProducts {
    void passedAMonth(); // 1月過ぎた時の利息計算メソッド
}

・SingleInterestProducts.java
package lesson1;

/* 単利商品 */
public class SingleInterestProducts implements FinancialProducts {
    int principal = 100; // 元金
    int price = principal; // 商品価格
    @Override
    public void passedAMonth() {
        price = (int) (price + principal * 0.1);
        System.out.println("現在の商品価格:"+price);
    }
}

・ComplexInterestProducts.java
package lesson1;

/* 複利商品 */
public class ComplexInterestProducts implements FinancialProducts {
    int principal = 100; // 元金
    int price = principal; // 商品価格
    @Override
    public void passedAMonth() {
        price = (int) (price + price * 0.1);
        System.out.println("現在の商品価格:"+price);
    }
}

・Main.java
package lesson1;

public class Main {

    public static void main(String[] args) {

        /* オブジェクトの生成 */
        SingleInterestProducts singleInterestProducts
            = new SingleInterestProducts();
        ComplexInterestProducts complexInterestProducts
            = new ComplexInterestProducts();

        /* 共通処理の実行 */
        System.out.println
            ("SingleInterestProductsオブジェクト(単利商品)");
        passedTwoMonths(singleInterestProducts);
        System.out.println
            ("ComplexInterestProductsオブジェクト(複利商品)");
        passedTwoMonths(complexInterestProducts);
    }

    /* 2月過ぎた時の利息計算メソッド */
    public static void passedTwoMonths
        (FinancialProducts financialProducts) {
        financialProducts.passedAMonth();
        financialProducts.passedAMonth();
        /* インターフェースを使っていないと、
         * SingleInterestProducts用とComplexInterestProducts用で
         * 別々にメソッドを定義しなければならなかった */
    }
}

【実行結果】
SingleInterestProductsオブジェクト(単利商品)
現在の商品価格:110
現在の商品価格:120
ComplexInterestProductsオブジェクト(複利商品)
現在の商品価格:110
現在の商品価格:121