|
import java.util.ArrayList; |
|
import java.util.LinkedList; |
|
|
|
// 条件のクラス |
|
|
|
class Ramen { |
|
|
|
// メソッド(Ramen, toString, ...) |
|
Ramen(String type) { |
|
utsuwa = new Utsuwa(); |
|
pasta = new Pasta(); |
|
topping.add(new Topping(Topping.Type.チャーシュー)); |
|
topping.add(new Topping(Topping.Type.卵)); |
|
topping.add(new Topping(Topping.Type.ネギ)); |
|
|
|
try { |
|
soup = new Soup(type); |
|
} catch (IllegalArgumentException e) { |
|
// 存在しないラーメンを頼まれたら,デフォルトにしちゃうよ |
|
soup = new Soup(); |
|
} |
|
|
|
System.out.println(this); |
|
} |
|
|
|
public String toString() { |
|
LinkedList<Topping> list = new LinkedList<Topping>(topping); |
|
return |
|
"器: " + utsuwa + "\n" |
|
+ "スープ: " + soup + "\n" |
|
+ "麺: " + pasta + "\n" |
|
+ "トッピング: " + CollectionUtil.join(list, ", "); |
|
} |
|
|
|
// フィールド(utsuwa, soup, pasta, topping) |
|
Utsuwa utsuwa; |
|
Soup soup; |
|
Pasta pasta; |
|
ArrayList<Topping> topping = new ArrayList<Topping>(); |
|
} |
|
|
|
class Utsuwa { |
|
enum Type { |
|
ラーメンどんぶり |
|
} |
|
Utsuwa() { |
|
this.type = Type.ラーメンどんぶり; |
|
} |
|
public String toString() { |
|
return type.name(); |
|
} |
|
Type type; |
|
} |
|
|
|
class Soup { |
|
enum Type { |
|
しょうゆ, |
|
みそ, |
|
しお |
|
} |
|
|
|
// オーバーロード(Soup) |
|
Soup() { |
|
this(Type.しょうゆ); |
|
} |
|
Soup(String type) throws IllegalArgumentException { |
|
this(Type.valueOf(type)); |
|
} |
|
Soup(Type type) { |
|
this.type = type; |
|
} |
|
|
|
public String toString() { |
|
return type.name(); |
|
} |
|
Type type; |
|
} |
|
|
|
class Pasta { |
|
enum Type { |
|
中太麺 |
|
} |
|
Pasta() { |
|
this.type = Type.中太麺; |
|
} |
|
public String toString() { |
|
return type.name(); |
|
} |
|
Type type; |
|
} |
|
|
|
class Topping { |
|
enum Type { |
|
チャーシュー, |
|
卵, |
|
ネギ, |
|
} |
|
Topping(Type type) { |
|
this.type = type; |
|
} |
|
public String toString() { |
|
return type.name(); |
|
} |
|
Type type; |
|
} |
|
|
|
// ここから補助クラス,インターフェイス |
|
|
|
class CollectionUtil { |
|
|
|
public static <T> String join(LinkedList<T> list, final String delim) { |
|
String first = list.removeFirst() + ""; |
|
return foldLeft(list, first, new Procedure<T, String>() { |
|
// オーバーライド(apply) |
|
@Override |
|
public String apply(String init, T element) { |
|
return init + delim + element; |
|
} |
|
}); |
|
} |
|
|
|
public static <A, B> B foldLeft(LinkedList<A> list, B init, Procedure<A, B> proc) { |
|
if (list.size() == 0) { |
|
return init; |
|
} else { |
|
B next = proc.apply(init, list.removeFirst()); |
|
return foldLeft(list, next, proc); |
|
} |
|
} |
|
} |
|
interface Procedure<A, B> { |
|
public B apply(B init, A element); |
|
} |