Javaでジェネリッククラスを作成して使用する方法

ジェネリックとは、コレクションに格納する型を指定できるプログラミングの概念です。ジェネリック型は、プリミティブ型以外の任意の値にすることができます。よく知られている従来の型パラメータは、文字列と整数です。

しかし、独自にジェネリック型を作成することもできます。さらに、ジェネリッククラスを作成して、ジェネリックを使用してさまざまなコレクションを作成することもできます。

ジェネリック型の作成

ジェネリック型は、本質的にクラスまたはインターフェースを使用して作成されたオブジェクトです。したがって、この記事では、ジェネリック型は顧客になります。サンプルのエンタープライズレベルのアプリケーションを使用して、顧客はデータベースシステムのエンティティを表します。このデータベースシステムは、3つの異なる都市に3つの実店舗を持つ家具会社にサービスを提供しています。

public abstract class Customer {private String name;public Customer(String name) {this.name = name;}public String getName() {return name;}}

上記のCustomerクラス宣言にabstractキーワードがあることに注目してください。これは、Customer型から直接型またはオブジェクトを作成できないことを意味します。

各実店舗には独自の顧客リストがあるため、アプリケーションには継承プログラミングの概念を使用して実装する3つの顧客サブクラスが必要です。

この3つのサブクラスは、ジェネリックCustomer型の堅固な型になります。最初のCustomerサブクラスには、次のコードが含まれます。

public class City1Customer extends Customer{public City1Customer(String name) {super(name);}}

ジェネリッククラスの作成

ジェネリック型を使用するには、この型をパラメータとして受け入れるジェネリッククラスまたはメソッドが必要です。ジェネリッククラスを作成するには、型パラメータをクラス宣言に挿入するだけです。

public class Promotion {}

上記のコードは、Promotionクラスがジェネリックであることを示しています。これは、Promotionクラスがオブジェクトの作成に型を使用することを意味します。これで、クラス宣言は文字列、整数、顧客などのオブジェクトのコレクションを受け取ることができます。ただし、家具会社はPromotionクラスがCustomer型を使用してオブジェクトを作成することのみを望んでいます。

public class Promotion {}

上記の更新されたコードにより、PromotionクラスはCustomer型のみを受け取るようになります。これは、Customerクラスのすべてのサブクラスを意味します。

3つの店舗があるため、企業は各店舗に1つの独立したプロモーションを作成したいと考えています。これらのプロモーションに必要なデータは似ています。各プロモーションには名前と、そのプロモーションで勝利した顧客のコレクションがあります。

この問題にはいくつかのアプローチ方法があります。Promotion親クラスを作成し、各店舗の場所ごとに3つのサブクラスを作成できます。しかし、各Promotionの構造が似ているため、重複したコードを書くことになり、非効率になります(特に、すでにCustomerサブクラスを使用している場合はなおさらです)。

したがって、Promotionジェネリッククラスはこの問題のより効率的なソリューションの1つです。

import java.util.ArrayList;public class Promotion {private String promoName;private ArrayList winners = new ArrayList();public Promotion(String promoName) {this.promoName = promoName;}public String getPromoName() {return promoName;}public void addCustomer(T customer) {if (winners.contains(customer)) {System.out.println( customer.getName() + " is already a winner of this prize.");} else {winners.add(customer);System.out.println( customer.getName() + " is a winner in the " + this.promoName);}}public int numWinners() {return this.winners.size();}}

Promotionジェネリッククラスには1つの変数(promoName)があります。このJavaクラスは、プロモーションに勝利した顧客のコレクション(winners)を受け入れ、それらをArrayListデータ構造に格納します。特定のプロモーションコレクションに新しい顧客を追加するには、addCustomer()メソッドを使用する必要があります。コレクション内の顧客の数をいつでも知りたい場合は、numWinners()メソッドを呼び出すことができます。

ジェネリッククラスを使用したコレクションの作成

コレクションの作成を開始する前に、顧客を作成する必要があります。

public class Main {public static void main(String[] args) {City1Customer john = new City1Customer("John Brown");City1Customer kelly = new City1Customer("Kelly James");City2Customer jane = new City2Customer("Jane Doe");City3Customer jess = new City3Customer("Jess Smith");}}

上記のMainクラスは、3つの店舗のいずれかに属する4つの顧客オブジェクトを作成します。コレクションの作成を開始するには、まずプロモーションオブジェクト(店舗の場所ごとに1つ)を作成する必要があります。

Promotion city1promo = new Promotion("City1 Promo");Promotion city2promo = new Promotion("City2 Promo");Promotion city3promo = new Promotion("City3 Promo");

上記の3行のコードをMainクラスに挿入すると、効果的に3つのタイプ固有(または場所固有)のプロモーションが作成されます。したがって、最初の都市の店舗(City1Customer)の顧客のみが、その都市のプロモーション(city1promo)で勝者になることができます。

city1promo.addCustomer(john);city1promo.addCustomer(kelly);

したがって、上記のコードをMainクラスに追加すると、コンソールに次の結果が表示されます。

ただし、最初の都市のプロモーション勝者リストに3人目の顧客を追加しようとすると、IDEでコンパイルエラーが発生します。

これは、JaneJessも最初の都市の店舗の顧客ではないためです。ジェネリック型とクラスを作成すると、このような単純なエラーが検出されずにシステムのデータベースが破損するのを防ぐことができるため、便利です。小規模なアプリケーションでは、このようなエラーを簡単に見つけることができますが、エンタープライズレベルのシステムでは、このようなエラーが見つからない場合があります。

city2promo.addCustomer(jane);

上記のコードで誤ったコード行を置き換えると、コンソールに次の出力が表示されます。

ジェネリック型を使用する利点

この記事のサンプルアプリケーションから、ジェネリック型を使用することの大きな利点の1つは、コンパイル時の型チェックであることがわかります。型チェックがなければ、Janeを3つのプロモーションリストのいずれかに追加しても、実行時エラーは発生しません。なぜなら、Janeは確かに家具会社の顧客だからです。

ジェネリックは、コードの再利用性と拡張性を含むその他の利点も提供します。企業が新しい都市に拡大するにつれて、既存のコードに大きく依存して、新しいプロモーションオブジェクトの型を簡単に作成できます。ジェネリック型を使用すると、効率的なコードを作成することもできます。これは、ソフトウェア開発プロセスにおける最優先事項です。