▶はじめに
ArraiListクラスの継承について最近学んだのでアウトプットのために記事を書こうと思いました。
初学者のため、間違いなどありましたご指摘いただけますと幸いです。
▶(前提)ArrayListとは
そもそもArrayListってなに?というところから説明できればと思います。
ArrayListとは、Listインターフェースを実装したクラスの一つです。
実装には配列が使われており、要素の追加や削除ができます。
配列ではないのか?と思う方もいるかもしれませんが
配列はサイズが宣言時に固定されている一方で、ArrayListは後から必要に応じて拡張されます。
ArrayList<-> 変数名 = new ArrayList<->();
//上記に書き方よりも下記で書かれていることの方が多い
List<-> 変数名 = new ArrayList<->();
なぜList<->という書き方なのかについては今回触れないので、調べていただければと思います。
(QiitaでもListとArrayListについて書かれている記事はたくさんありました)
実際のコードとしては、下記のような書き方になります
List<String> sports = new ArrayList<String>();
sports.add("サッカー");
sports.add("野球");
sports.add("テニス");
//取り出すときは拡張for文
for(String s : sports){
System.out.println(s);
}
上記を前提として、ArrayListクラスの継承について書いていきます。
▶ArrayListクラスの継承
ArrayListクラスの継承は下記のようにします
public class Sample extends ArrayList<T>{
// ここに追加のメソッドやフィールドを定義することができる
// ArrayListクラスのメソッドや機能は自動的に継承される
}
ここで注意するべき点があります。
ArrayListはSelializableインターフェースを実装しているので、下記の一文を書かないと警告がでるそう
private static final long serialVersionUID = 1L;
ちなみに私を書かなくても警告もでず実行できてしまった(どうやら事前に警告が出るように設定してないとそのままいけてしまうぽい)ので、上記の必要性やシリアライズってなに?というところはこれから勉強していきます
▶実際に使ってみよう
簡単なショッピングカートを実装する際にArrayListクラスがどう使われるのかをみていきましょう。
Itemクラス,ShoppingCartクラスを使って上記のArrayListの継承をやっていきます。
※Itemクラスを継承する商品クラスは今回記載を省きます。
public class Item {
/** 商品名 */
private String name;
/** 値段 */
private Integer price;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getPrice() {
return price;
}
public void setPrice(Integer price) {
this.price = price;
}
}
public class ShoopingCart extends ArrayList<Item>{
private static final long serialVersionUID = 1L;
/**
* 商品の合計金額を取得する.
* @return 商品の合計金額
*/
public int getTotalPrice() {
int totalPrice = 0;
for (Item item : this) {
totalPrice += item.getPrice();
}
return totalPrice;
}
/**
* 商品の平均金額を取得する.
* @return 商品の平均金額
*/
public double getAverage() {
return getTotalPrice() / size();
}
}
ShoppingCartの実装を見てみるとArrayListをしていることによって、ArrayListクラスのメソッドを継承することができsize()メソッドをそのまま使えていますね。
ArrayListクラス他にもを継承することにより、add(),remove()メソッドなども使用可能になります。
▶最後に
オブジェクト指向や継承をしっかり理解しておかないとなかなかイメージがつきづらいなと感じる一方で、逆に理解できていれば継承などを用いてよりスマートなコードが書けるのではないかと思いました。
(記事を書くのは難しい、、)