javaにはインターフェースという機能があります。
インターフェースとは、メソッドの仕様(メソッド名、戻り値、引数)のみを定義したものです。
インターフェース単独では処理を実行できませんが、そのインターフェースを実装したクラスを定義することで処理を実行可能になります。
インターフェースを利用するメリットとしては、重複した記述を無くせることがあります。
オブジェクトを参照する際にインターフェース名を指定することで、そのインターフェースを実装している全てのクラスを指すことができます。一つの記述で複数のクラスに対応させることができるので、クラスごとに同じ記述を行う必要が無くなり、保守性が向上します。
言葉だと通じにくいと思うので、サンプルコードを用意しました。
【サンプルコード】
まず、インターフェースとして、金融商品インターフェース(FinancialProductsインターフェース)を定義します。
このインターフェースは、1ヶ月後の商品価格を計算するメソッドを持ちます。
・FinancialProducts.java
1 2 3 4 5 6 |
package lesson1; /* 金融商品(インターフェース) */ public interface FinancialProducts { void passedAMonth(); // 1ヶ月後の商品価格計算メソッド } |
次に、金融商品インターフェースを実装します。
単利商品クラス(SingleInterestProductsクラス)と、複利商品クラス(ComplexInterestProductsクラス)を実装します。
この2つのクラスは、共に1ヶ月後の商品価格を計算するメソッドを実装していますが、その実装内容(計算ロジック)は異なります。
・SingleInterestProducts.java
1 2 3 4 5 6 7 8 9 10 11 12 |
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
1 2 3 4 5 6 7 8 9 10 11 12 |
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); } } |
そして、単利商品クラスと複利商品クラスを使用するメインクラスです。
メインクラス内で定義している2ヶ月後の商品価格計算メソッドにて、金融商品インターフェースを参照することで、単利商品クラスと複利商品クラスを同じ記述で使用することができているのがポイントです。
・Main.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
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用で * 別々にメソッドを定義しなければならない */ } } |
【実行結果】
1 2 3 4 5 6 |
SingleInterestProductsオブジェクト(単利商品) 現在の商品価格:110 現在の商品価格:120 ComplexInterestProductsオブジェクト(複利商品) 現在の商品価格:110 現在の商品価格:121 |
いかがでしたでしょうか。
インターフェースはjavaの基礎的な文法の一つです。
しかし、インターフェースは様々な形で応用されています。
例えば、配列のソートで独自定義を行う時にインターフェースの理解が必要になりますし、デザインパターンやフレームワークといったオブジェクト指向の設計手法でもインターフェースは頻出です。
そのため、単純に読める・コンパイルエラーにならないコードを書ける、というレベルの理解ではなく、これを使うと何が嬉しいのか、というレベルで理解するのが望ましい、と個人的には思います。
これからも、実務で役に立つ情報をお伝えできればと思います。
では、また来週!
コメント