Javaのインターフェースを使った実装について
イートスマートの新人エンジニアが、Javaの開発業務の中でインターフェースを使った実装を行ったので学んだ内容を振り返ってみたいと思います。
Javaのインターフェースについて
インターフェースとは、それ自体には具体的な処理をもたせずに、別のクラスでメソッドを追加することで利用されるものです。そのため、インターフェースには変数とメソッドの型のみを定義しておきます。
実装する内容について
今回、スマートフォンのサイト側でもぐナビ(弊社が提供する食品の口コミサイト)で開催した「イベント」、「お知らせ」、「ニュース」と3つの異なる情報を一覧として表示させたいと思います。
なぜインターフェースが必要になるのか
今回必要な情報は、 ①出来事の開始日 ②タイトル ③ラベル表示(イベント、お知らせ、ニュースの表示分け) ④遷移先URL になります。 表示する内容は、「イベント」、「お知らせ」、「ニュース」で共通ですが元々3つのリソースで定義しているフィールド名が違うため(あるいは元々存在しない)、問題が生じます。上記タイトルで言えば「イベント」はeventTitleですが、「お知らせ」ではinformationTitleなどと同一の名前として、扱えないためそれらを共通化するような処理を挟みたいと考えます。 そこで、便宜的にIEventというインターフェースを作り、リソース間で生じる差異をなくし、共通のフォーマットに落とし込むことを実現します。
実装例
以下に実装例を示します。(※関係する部分のみを記載しています) 今回は、「イベント」情報のフォーマットに「お知らせ」情報も共通化させて、一覧に必要な情報(開始日、タイトル、ラベル、URL)を取得するという流れをみていきます。
IEvent.java(インターフェース)
public interface IEvent { public String getEventTitle(); //タイトルを取得 public String getEventUrl(); //遷移先URLを取得 public Date getInformationStartDate(); //開始日を取得 public String getEventLabel(); //ラベルの色を取得 public String getEventLabelClassName(); //ラベル名を取得 }
InformationBean.java(お知らせ情報に関するBean)
import jp.mognavi.event.IEvent; public class InfomationBean implements IEvent{ /**implementsと記述し、インターフェースを実装*/ private String informationTitle; private Date informationStartDate; public String getInformationTitle() { return informationTitle; } public void setInformationTitle(String informationTitle) { this.informationTitle = informationTitle; } public Date getInformationStartDate() { return informationStartDate; } /**元々InformationStartDateという同一のフィールド名のため、以下のような オーバーライドの必要がない。 */ public void setInformationStartDate(Date informationStartDate) { this.informationStartDate = informationStartDate; } /**以下では、IEventで定義したメソッドをオーバーライドし、お知らせのBeanの フィールド名に該当するものを返却している。*/ @Override public String getEventTitle() { return informationTitle; } @Override public String getEventUrl() { return "/do/information/show/param/informationId/" + informationId; } @Override public String getEventLabel() { return "お知らせ"; } @Override public String getEventLabelClassName() { return ※"infolabel"; } /**※表示側のクラスにinfolabelという名前を付与することで、CSSで お知らせ用のカラーが当たるようにしている。 */ }
以上になります。インターフェース(IEvent)を作ることで、この先例えば「リリース」情報などが一覧に追加されても実装が容易になることが想像できます。 Javaのインターフェースは一見わかりにくい概念だと思うのですが、実際に使ってみるととても便利なものだと実感しました。