クラスの継承(open)、可変長引数(vararg)、暗黙のtoStringとそのoverride、ビルダーパターンなどの例。内容はソースコード内のコメントを参照。
以下のような注文リストを作成するためのプログラム構造
Order #1
Noodles: $10
Total: $10
Order #2
Noodles: $10
Vegetables Chef’s Choice: $5
Total: $15
Order #3
Noodles: $10
Vegetables Carrots, Beans, Celery: $5
Total: $15
Order #4
Noodles: $10
Vegetables Cabbage, Onion: $5
Total: $15
Order #5
Noodles: $10
Noodles: $10
Vegetables Spinach: $5
Total: $25
// openキーワードの親クラス(Item)
open class Item(val name: String, val price: Int)
// 単純なItemの子クラス
class Noodles : Item("Noodles", 10) {
// toStringをoverrideしてnameを戻す
override fun toString(): String {
return name
}
}
// Itemの子クラスで、可変長引数(vararg)を持つ
class Vegetables(vararg val toppings: String) : Item("Vegetables", 5) {
// toStringをoverrideしてnameを戻す
// (Kotlinでclassを作成するとtoStringメソッドが暗黙的に作成されているのでoverrideできる)
override fun toString(): String {
if (toppings.isEmpty()) {
return "$name Chef's Choice"
} else {
return name + " " + toppings.joinToString()
}
}
}
// 注文クラス(注文明細を持ち、Itemの追加やprint機能も包含する)
class Order(val orderNumber: Int) {
// Item型の可変List(注文の明細を格納する)
private val itemList = mutableListOf<Item>()
// Item(個別)の明細を追加して自身(Order)を戻す関数
fun addItem(newItem: Item): Order {
itemList.add(newItem)
// 自身(Order)を戻す事によりメイン関数でビルダーパターンを実装可能
return this
}
// Items(複数)の明細を追加して自身(Order)を戻す関数
fun addAll(newItems: List<Item>): Order {
itemList.addAll(newItems)
// 自身(Order)を戻す事によりメイン関数でビルダーパターンを実装可能
return this
}
// 注文内容を表示
fun print() {
println("Order #${orderNumber}")
var total = 0
for (item in itemList) {
println("${item}: $${item.price}")
total += item.price
}
println("Total: $${total}")
}
}
// メイン関数
fun main() {
// 全ての注文を格納する可変リスト(Order型)
val ordersList = mutableListOf<Order>()
// 注文1 Noodlesのみ
val order1 = Order(1)
order1.addItem(Noodles())
ordersList.add(order1)
// 注文2 Noodlesの注文の後、引数なしのVegetablesを注文
val order2 = Order(2)
order2.addItem(Noodles())
order2.addItem(Vegetables())
ordersList.add(order2)
// 注文3 Noodlesと引数ありのVegetablesを同時に注文
val order3 = Order(3)
val items = listOf(Noodles(), Vegetables("Carrots", "Beans", "Celery"))
order3.addAll(items)
ordersList.add(order3)
// 注文4 注文3のパターンをビルダーパターンで表記
// Use builder pattern
val order4 = Order(4)
.addItem(Noodles())
.addItem(Vegetables("Cabbage", "Onion"))
ordersList.add(order4)
// 注文5 ビルダーパターンで変数を使わず直接addするパターン
ordersList.add(
Order(5)
.addItem(Noodles())
.addItem(Noodles())
.addItem(Vegetables("Spinach"))
)
// Print out each order
for (order in ordersList) {
order.print()
println()
}
}
トレーニング > KOTLIN を用いた ANDROID の基本 > レイアウト > スクロール可能なリスト > Kotlinでリストを使用する > 6. コードを改善する