skillup

技術ブログ

Java

型パラメータに関して その2

投稿日:2015年8月1日 更新日:

Javaでオブジェクト指向に基づいたコーディングをするために必須であり、最初の難関だったのが型パラメータでした。

型パラメータが必要なケース

以前「 型パラメータに関して」でまとめてブログを書きはしたんですけど、正直わかっておらず頭にはてなマークが並んでいました。

例えば商品マスタと顧客マスタの画面を作り、機能が似通ってる場合、共通の処理などは当然抽象クラスで定義したほうが、コーディング量が少なくなりますし、保守性も向上します。

しかし、JavaはPHPなどと違い型があるため、なかなかこれが難しかったりします。

どんなケースで必要かというと・・

データ自体をクラスで定義し、商品マスタではProductと顧客マスタではCustomerというクラスでデータを入れて引き回す、というようなケースです。

普通に書く場合はList<Product>などと書けばいいのですが、これを抽象クラスで定義する場合、当然具体的なクラスは書けません。

その場合、Tなどと型情報を入れる変数などを定義することが一般的です。

そのため抽象クラスには下記のように記述します。

上記のクラスを継承した具象クラスは下記のように書きます。

型パラメータの制限

上記は通常の書き方ですが、型に制限をしたいときなどもあると思います。

例えばある基底となるクラス(BaseClassとしましょう。)があり、そのクラスを使いたいときです。

またそうしないとゲッター、セッター、特定のメソッドを書くことができません。(リフレクションという手もありますが・・・)

その場合、TはBaseClassの拡張である、ということを定義しないといけません。そのために下記のように書きます。

クラスインスタンスの登録

なお上記は通常のクラスを登録していますが、実際にはクラスインスタンスを登録することのほうが多いでしょう。

現状のプロジェクトだとJPAを使っているのでクラスインスタンスがそもそも必要なのですが、それ以外にもそのクラスに関する様々な情報を取得できるという点でクラスインスタンスのほうがただのクラスよりも使えると思います。

その場合、下記のような記述方法になります。

ちなみに具象クラスはこのようになります。

メソッド単位での型パラメータ

上記のように書いておけばインスタンス生成時に個別のクラス情報が登録されるので、あとはクラス内でList<T>などとして使いまわすことができます。

ただ、メソッド単位では別のクラスを使いたいなどというときもあるでしょう。

私のケースであったのは、商品マスタに値を登録しようとおもってもProductのほかにProductDTOなどという別のクラスを作っている場合です。

例えばProductにmakerIdなどというメーカーを識別するIDを持たせている場合、画面で表示するときには具体的なメーカー名などが必要になる場合です。

その場合、もともとのProductではなくProductを拡張したProductDTOというクラスも使用しなくてはいけません。

つまり恒常的に使うクラスのほかに、スポット(メソッド単位)で使うようなクラスも動的に使いたい場合の方法を考えなくてはいけません。

メソッド単位のクラスの場合は引数などで型パラメータを使い、下記のように戻り値の前に型を定義してあげれば大丈夫です。

T1自体も型を制限したい場合はT1 extends ~などと記述してあげればOKです。

上記理解でも不十分なところは多いと思いますが、これを身につけないとどうしても抽象度の高い実装ができないので何とか頑張って身につけたいところです。

-Java
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

Javadocに関して

業務で社内で使うクラスライブラリを作成中です。 他人に使ってもらうものなのでコメントやドキュメント周りの整備が必要になり、javadocをしっかり作りたいと思っています。 Contents1 java …

no image

配列の初期化&代入+Mapから別Map作成

最近、業務ではコードの量が肥大化し、とにかく短く書くことを心がけてます。 まあ、短ければいいってもんでもないんですが・・・ Listにクラスを使いするときに↓みたいな書き方を紹介したんですが、 [cr …

no image

DBUtils活用

普段はJavaEEで開発を行っているのでデータベースへのアクセスはJPAを活用しています。 ただ、JavaEE環境だとglassfish経由でデータベースを動かしているので、glassfishを動かさ …

no image

JSPでのカスタムタグ

前回のインク―ドですが、文字列以上の情報を渡すことはできませんでした。 いろいろ調べたり、上司に聞いてみるとカスタムタグという独自のタグを作る機能があるとのことでさっそく調査。 Contents1 カ …

no image

JSPでのAjax(dwr使用)

JSPネタ3本目。 Ajaxです。 こちらも独自のライブラリを使うようですね。 drwというものが有名のようです。 Contents1 dwr1.1 pomでの記述1.2 web.xml1.3 dwr …