久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

thinking-in-java(19)枚举类型

發(fā)布時間:2023/12/3 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 thinking-in-java(19)枚举类型 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
【0】開場白
1)關(guān)鍵字 enum
可以將一組具名的值的有限集合創(chuàng)建為一種新的類型,而這些具名的值可以作為常規(guī)的程序組件使用;
2)所有的枚舉類都繼承自 Enum,通過 enumClass.getSuperclass() = class java.lang.Enum 得知。??Enum的源碼如下 (本文斗膽把 Enum 稱為 枚舉基類,enum稱為枚舉類,enum中聲明的成員稱為枚舉實(shí)例序列)
// java.lang.Enum枚舉類源碼 public abstract class Enum<E extends Enum<E>>implements Comparable<E>, Serializable {private final String name;public final String name() {return name;}private final int ordinal;public final int ordinal() {return ordinal;}protected Enum(String name, int ordinal) {this.name = name;this.ordinal = ordinal;}public String toString() {return name;}public final boolean equals(Object other) {return this==other;}public final int hashCode() {return super.hashCode();}protected final Object clone() throws CloneNotSupportedException {throw new CloneNotSupportedException();}public final int compareTo(E o) {Enum<?> other = (Enum<?>)o;Enum<E> self = this;if (self.getClass() != other.getClass() && // optimizationself.getDeclaringClass() != other.getDeclaringClass())throw new ClassCastException();return self.ordinal - other.ordinal;}@SuppressWarnings("unchecked")public final Class<E> getDeclaringClass() {Class<?> clazz = getClass();Class<?> zuper = clazz.getSuperclass();return (zuper == Enum.class) ? (Class<E>)clazz : (Class<E>)zuper;}public static <T extends Enum<T>> T valueOf(Class<T> enumType,String name) {T result = enumType.enumConstantDirectory().get(name);if (result != null)return result;if (name == null)throw new NullPointerException("Name is null");throw new IllegalArgumentException("No enum constant " + enumType.getCanonicalName() + "." + name);}/*** enum classes cannot have finalize methods.*/protected final void finalize() { }/*** prevent default deserialization*/private void readObject(ObjectInputStream in) throws IOException,ClassNotFoundException {throw new InvalidObjectException("can't deserialize enum");}private void readObjectNoData() throws ObjectStreamException {throw new InvalidObjectException("can't deserialize enum");} } 【19.1】基本enum特性
【荔枝-基本enum特性】

/* 荔枝-基本enum特性 */ enum Shrubbery {GROUND, CRAWLING, HANGING } public class EnumClass {public static void main(String[] args) {// Shrubbery.values() 返回 enum 實(shí)例的數(shù)組(數(shù)組中的元素嚴(yán)格保持在enum中聲明的順序)for (Shrubbery s : Shrubbery.values()) {print("s.ordinal() = " + s.ordinal()); // s.ordinal() 返回enum實(shí)例在聲明時的次序;printnb("s.compareTo(Shrubbery.CRAWLING) = " + s.compareTo(Shrubbery.CRAWLING));printnb("\ns.equals(Shrubbery.CRAWLING) = " + s.equals(Shrubbery.CRAWLING));print("\n(s == Shrubbery.CRAWLING) = " + (s == Shrubbery.CRAWLING));print("s.getDeclaringClass() = " + s.getDeclaringClass());print("s.name() = " + s.name());print("----------------------");}// Produce an enum value from a string name:for (String s : "HANGING CRAWLING GROUND".split(" ")) {Shrubbery shrub = Enum.valueOf(Shrubbery.class, s);print("Enum.valueOf(Shrubbery.class, s) = " + shrub);}} } /* s.ordinal() = 0 s.compareTo(Shrubbery.CRAWLING) = -1 s.equals(Shrubbery.CRAWLING) = false (s == Shrubbery.CRAWLING) = false s.getDeclaringClass() = class chapter19.Shrubbery s.name() = GROUND ---------------------- s.ordinal() = 1 s.compareTo(Shrubbery.CRAWLING) = 0 s.equals(Shrubbery.CRAWLING) = true (s == Shrubbery.CRAWLING) = true s.getDeclaringClass() = class chapter19.Shrubbery s.name() = CRAWLING ---------------------- s.ordinal() = 2 s.compareTo(Shrubbery.CRAWLING) = 1 s.equals(Shrubbery.CRAWLING) = false (s == Shrubbery.CRAWLING) = false s.getDeclaringClass() = class chapter19.Shrubbery s.name() = HANGING ---------------------- Enum.valueOf(Shrubbery.class, s) = HANGING Enum.valueOf(Shrubbery.class, s) = CRAWLING Enum.valueOf(Shrubbery.class, s) = GROUND */ 【代碼解說】
解說1)
可以使用 == 來比較 enum實(shí)例,編譯器自動提供了 equals() 和 hashCode() 方法;
解說2)Enum類實(shí)現(xiàn)了 Comparable接口,所以具有 compareTO()方法,Enum 還實(shí)現(xiàn)了 Serializable 接口;
解說3)enum實(shí)例的getDeclaringClass() 方法返回 enum實(shí)例所屬的enum類;
解說4)enum實(shí)例的 name()方法返回 實(shí)例聲明時的名字;
解說5)valueOf()方法是Enum類的靜態(tài)方法,返回相應(yīng)的 enum 實(shí)例數(shù)組;(數(shù)組元素按照聲明時的順序排序)


【19.1.1】將靜態(tài)導(dǎo)入用于 enum
1)使用 static import :?
將 enum實(shí)例的標(biāo)識符帶入當(dāng)前的命名空間,無需再用enum類型修飾 enum 實(shí)例;
【荔枝-使用靜態(tài)導(dǎo)入引入 枚舉類】
package chapter5;import static chapter5.Spiciness5.*; // 使用靜態(tài)導(dǎo)入public class Burrito {Spiciness5 degree;public Burrito(Spiciness5 degree) {this.degree = degree;}public void describe() {System.out.print("This burrito is ");switch (degree) {case NOT:System.out.println("not spicy at all.");break;case MILD:case MEDIUM:System.out.println("a little hot.");break;case HOT:case FLAMING:default:System.out.println("maybe too hot.");}}public static void main(String[] args) { // Burrito plain = new Burrito(Spiciness5.NOT); // Burrito greenChile = new Burrito(Spiciness5.MEDIUM); // Burrito jalapeno = new Burrito(Spiciness5.HOT);// 不使用 enum 類修飾的語法Burrito plain = new Burrito(NOT);Burrito greenChile = new Burrito(MEDIUM);Burrito jalapeno = new Burrito(HOT);plain.describe();greenChile.describe();jalapeno.describe();} } /* This burrito is not spicy at all. This burrito is a little hot. This burrito is maybe too hot. */ 【荔枝【編譯報錯】-使用靜態(tài)導(dǎo)入的前提條件】
package chapter19;import chapter5.Spiciness5; // 但是可以使用普通導(dǎo)入(無法使用靜態(tài)導(dǎo)入)// 荔枝【編譯報錯】-使用靜態(tài)導(dǎo)入的前提條件(Burrito 與 Spiciness5 在同一個包,) // 這里的荔枝是 Spiciness5 在chapter5 包,而Burrito在chapter19包,所以編譯報錯; //import static chapter5.Spiciness5; public class Burrito {Spiciness5 degree;public Burrito(Spiciness5 degree) {this.degree = degree;}public String toString() {return "Burrito is " + degree;}public static void main(String[] args) {System.out.println(new Burrito(Spiciness5.NOT));System.out.println(new Burrito(Spiciness5.MEDIUM));System.out.println(new Burrito(Spiciness5.HOT));} } 【19.2】向enum中添加新方法
1)enum沒有繼承機(jī)制,除此之外,enum類是一個常規(guī)類,有自己的方法和main方法;


【荔枝-每個枚舉實(shí)例能夠返回自身的描述】

// 荔枝-每個枚舉實(shí)例能夠返回自身的描述 public enum OzWitch {// Instances must be defined first, before methods:WEST("Miss Gulch, aka the Wicked Witch of the West"), NORTH("Glinda, the Good Witch of the North"), EAST("Wicked Witch of the East, wearer of the Ruby Slippers, crushed by Dorothy's house"), SOUTH("Good by inference, but missing");private String description;// Constructor must be package or private access:// 構(gòu)造函數(shù)必須是包或私有訪問private OzWitch(String description) {this.description = description;}// enum類有自己的方法public String getDescription() {return description;}// enum類有 main() 方法public static void main(String[] args) {for (OzWitch witch : OzWitch.values()) // OzWitch.values() 返回 enum 實(shí)例數(shù)組print(witch + ": " + witch.getDescription());} } /* WEST: Miss Gulch, aka the Wicked Witch of the West NORTH: Glinda, the Good Witch of the North EAST: Wicked Witch of the East, wearer of the Ruby Slippers, crushed by Dorothy's house SOUTH: Good by inference, but missing */ 【代碼解說】
解說1)
在enum 實(shí)例序列的最后添加一個分號: 如 SOUTH("Good by inference, but missing");
解說2)java要求先定義 enum 實(shí)例,后定義 方法 和 屬性;否則編譯報錯;
解說3)荔枝中,enum類的構(gòu)造方法為private,但不會影響創(chuàng)建 enum實(shí)例(不影響包之外的類調(diào)用該枚舉實(shí)例),因?yàn)橹荒茉?enum 內(nèi)部使用構(gòu)造器創(chuàng)建 enum 實(shí)例;

【19.2.1】覆蓋 enum 的方法
1)通過覆蓋 enum 類的 toString() 方法來實(shí)現(xiàn) 描述enum實(shí)例名字;
【荔枝-覆蓋 enum類的toString() 方法】

// 荔枝-覆蓋 enum類的toString() 方法 public enum SpaceShip {// 在enum 實(shí)例序列的最后添加一個分號:SCOUT, CARGO, TRANSPORT, CRUISER, BATTLESHIP, MOTHERSHIP; // 覆蓋toString() 方法@Overridepublic String toString() {String id = name();String lower = id.substring(1).toLowerCase();return id.charAt(0) + lower;}public static void main(String[] args) {for (SpaceShip s : values()) { // values 返回 枚舉實(shí)例數(shù)組System.out.println(s);}} } /* Scout Cargo Transport Cruiser Battleship Mothership */ 【19.3】switch語句中的enum:這是enum提供的一項(xiàng)非常便利的功能
1)enum類的ordinal()方法:
獲取該 enum實(shí)例的聲明次序;
2)case語句中不必使用 enum類型修飾 enum實(shí)例;


【荔枝-case語句中不必使用 enum類型修飾 enum實(shí)例】

// 定義一個枚舉類 enum Signal {GREEN, YELLOW, RED, }// 荔枝(使用 enum 構(gòu)建一個小型狀態(tài)機(jī))-case語句中不必使用 enum類型修飾 enum實(shí)例 // 不必使用 enum類型修飾 enum實(shí)例,還可以通過 靜態(tài)導(dǎo)入來引入同一個包下的枚舉類實(shí)現(xiàn) public class TrafficLight {Signal color = Signal.RED;public void change() {switch (color) { // switch 塊 與 enum 實(shí)例的結(jié)合使用case RED: // 不必使用 enum類型修飾 enum實(shí)例,不必用 Signal.REDcolor = Signal.GREEN;break;case GREEN: // 不必使用 enum類型修飾 enum實(shí)例,同理color = Signal.YELLOW;break;case YELLOW: // 不必使用 enum類型修飾 enum實(shí)例,同理color = Signal.RED;break;//注意:這里沒有default 語句 }}public String toString() {return "The traffic light is " + color;}public static void main(String[] args) {TrafficLight t = new TrafficLight();for (int i = 0; i < 7; i++) {print("t = " + t);t.change();}} } /* The traffic light is RED The traffic light is GREEN The traffic light is YELLOW The traffic light is RED The traffic light is GREEN The traffic light is YELLOW The traffic light is RED */ 【代碼解說】
解說1)
當(dāng) switch 與 enum 實(shí)例結(jié)合使用的時候,編譯器允許沒有 default 語句;
解說2)注釋掉其中一個case語句,編譯器也不會報錯;所以必須確保 switch中的case 覆蓋了所有 enum 枚舉實(shí)例分支;
解說3)case語句中有return 語句:編譯器就會抱怨沒有 default 語句了;

【19.4】values()的神秘之處
1)Enum類并沒有values()方法:
編譯器創(chuàng)建的 enum類對象 都繼承自 Enum類;但是Enum類并沒有 values() 方法;


【荔枝-Enum類沒有定義 values()方法,但Enum實(shí)例有 values()方法,這個values()方法是編譯器加上去的】

// 定義一個枚舉類 enum Explore {HERE, THERE } // 荔枝-Enum類沒有定義 values()方法,但Enum實(shí)例有 values()方法,這個values()方法是編譯器加上去的。 public class Reflection {public static Set<String> analyze(Class<?> enumClass) {print("\n----- enumClass = " + enumClass + " -----");print("Interfaces:");// 通過反射獲取 enumClass對應(yīng)的類實(shí)現(xiàn)的接口列表for (Type t : enumClass.getGenericInterfaces()) // java.lang.reflect.Typeprint("t = " + t);print("enumClass.getSuperclass() = " + enumClass.getSuperclass());Set<String> methods = new TreeSet<String>();// 通過反射獲取 enumClass對應(yīng)的類的方法列表for (Method m : enumClass.getMethods())methods.add(m.getName());print("methods = " + methods);return methods;}public static void main(String[] args) {Set<String> exploreMethods = analyze(Explore.class); // Explore 有 values()方法 Set<String> enumMethods = analyze(Enum.class); // Enum 沒有 values()方法print("enumMethods = " + enumMethods + "\n");print("exploreMethods.containsAll(enumMethods) = "+ exploreMethods.containsAll(enumMethods));exploreMethods.removeAll(enumMethods);print("exploreMethods.removeAll(enumMethods); exploreMethods = " + exploreMethods);// Decompile the code for the enum:OSExecute.command("javap chapter19.Explore"); // 對 chapter19.Explore 進(jìn)行反編譯} } /* ----- enumClass = class chapter19.Explore ----- Interfaces: // 父類 enumClass.getSuperclass() = class java.lang.Enum // enum 實(shí)例的方法列表 methods = [compareTo, equals, getClass, getDeclaringClass, hashCode, name, notify, notifyAll, ordinal, toString, valueOf, values, wait]----- enumClass = class java.lang.Enum ----- Interfaces: t = java.lang.Comparable<E> t = interface java.io.Serializable enumClass.getSuperclass() = class java.lang.Object // Enum 類的方法列表 methods = [compareTo, equals, getClass, getDeclaringClass, hashCode, name, notify, notifyAll, ordinal, toString, valueOf, wait] enumMethods = [compareTo, equals, getClass, getDeclaringClass, hashCode, name, notify, notifyAll, ordinal, toString, valueOf, wait]exploreMethods.containsAll(enumMethods) = true exploreMethods.removeAll(enumMethods); exploreMethods = [values] Compiled from "Reflection.java" // 對 chapter19.Explore 進(jìn)行反編譯 final class chapter19.Explore extends java.lang.Enum<chapter19.Explore> { public static final chapter19.Explore HERE;public static final chapter19.Explore THERE;public static chapter19.Explore[] values();public static chapter19.Explore valueOf(java.lang.String);static {}; } */ 【代碼解說】
解說1)
enum實(shí)例的values() 方法:是編譯器添加的 static方法;Enum 類中沒有定義 values() 方法;
解說2)enum實(shí)例的 valueOf(java.lang.String) 方法(一個參數(shù)):也是編譯器添加的;覆蓋掉了 Enum.valueOf() 方法了;
解說3)Enum類定義了一個 valueOf() 方法(有兩個參數(shù));
// Enum.valueOf() 源碼(兩個參數(shù)) public static <T extends Enum<T>> T valueOf(Class<T> enumType,String name) {T result = enumType.enumConstantDirectory().get(name);if (result != null)return result;if (name == null)throw new NullPointerException("Name is null");throw new IllegalArgumentException("No enum constant " + enumType.getCanonicalName() + "." + name);} 解說4)enum 實(shí)例被 final修飾:所以enum 無法繼承;


2)如果將 enum 實(shí)例向上轉(zhuǎn)型為 Enum 類型,那么values()方法就不可訪問了;

3)Class.getEnumConstants()方法:?通過該對象取得所有 enum 實(shí)例;


【荔枝-通過 Class.getEnumConstants()方法取得所有 enum 實(shí)例】

enum Search {HITHER, YON } // 荔枝-通過 Class.getEnumConstants()方法取得所有 enum 實(shí)例 public class UpcastEnum {public static void main(String[] args) {Search[] vals = Search.values();Enum e = Search.HITHER; // Upcast-向上轉(zhuǎn)型// e.values(); // Enum 類沒有 values() 方法,編譯報錯:// 通過 Class.getEnumConstants()方法 獲取所有 enum 實(shí)例數(shù)組for (Enum en : e.getClass().getEnumConstants())System.out.println(en);} } /* HITHER YON */ 4)不是枚舉的類也可以調(diào)用 Class.getEnumConstants() 方法:


【荔枝-不是枚舉的類調(diào)用 Class.getEnumConstants() 方法(報空指針異常)】

// 荔枝-不是枚舉的類調(diào)用 Class.getEnumConstants() 方法 public class NonEnum {public static void main(String[] args) {Class<Integer> intClass = Integer.class;try {// Integer.class.getEnumConstants() 報空指針異常for (Object en : intClass.getEnumConstants())System.out.println(en);} catch (Exception e) {System.out.println(e);}} } /** Output: java.lang.NullPointerException*/// :~ 【19.5】實(shí)現(xiàn),而非繼承
1)所有 enum 類都繼承自 java.lang.Enum 類;

2)由于不能多繼承,所以只能實(shí)現(xiàn);

【荔枝-所有 enum 類都繼承自 java.lang.Enum 類,只能實(shí)現(xiàn)】

// 荔枝-所有 enum 類都繼承自 java.lang.Enum 類,只能實(shí)現(xiàn) enum CartoonCharacter implements Generator<CartoonCharacter> {SLAPPY, SPANKY, PUNCHY, SILLY, BOUNCY, NUTTY, BOB;private Random rand = new Random(47);public CartoonCharacter next() {return values()[rand.nextInt(values().length)];} }public class EnumImplementation {public static <T> void printNext(Generator<T> rg) { // 這里傳入 Generator,是策略模式System.out.print(rg.next() + ", ");}public static void main(String[] args) {// 選擇任何一個實(shí)例CartoonCharacter cc = CartoonCharacter.BOB;for (int i = 0; i < 10; i++)printNext(cc);} } /* BOB, PUNCHY, BOB, SPANKY, NUTTY, PUNCHY, SLAPPY, NUTTY, NUTTY, SLAPPY, */ 【19.6】隨機(jī)選取
1)從enum實(shí)例中隨機(jī)選擇enum實(shí)例;


【荔枝-隨機(jī)選取 enum 實(shí)例】

// 荔枝-隨機(jī)選取 enum 實(shí)例 public class Enums {private static Random rand = new Random(47);// 通過反射 Class.getEnumConstants() 來隨機(jī)選取public static <T extends Enum<T>> T random(Class<T> ec) {// 通過 Class.getEnumConstants()方法取得所有 enum 實(shí)例return random(ec.getEnumConstants());}public static <T> T random(T[] values) {return values[rand.nextInt(values.length)]; // 隨機(jī)選取} } // /:~其中,<T extends Enum<T>> 表示 T 是一個 enum 實(shí)例;將 Class<T> 作為參數(shù)的話,就可以利用 Class對象得到 enum 實(shí)例的數(shù)組了;

【測試?yán)笾?隨機(jī)選取 enum 實(shí)例】
// 測試?yán)笾?隨機(jī)選取 enum 實(shí)例 enum Activity {SITTING, LYING, STANDING, HOPPING, RUNNING, DODGING, JUMPING, FALLING, FLYING }public class RandomTest {public static void main(String[] args) {for (int i = 0; i < 20; i++)// 這里必須傳入一個 enum是的 class 引用System.out.print(Enums.random(Activity.class) + " ");} } /* STANDING FLYING RUNNING STANDING RUNNING STANDING LYING DODGING SITTING RUNNING HOPPING HOPPING HOPPING RUNNING STANDING LYING FALLING RUNNING FLYING LYING */ 【19.7】使用接口組織枚舉
1)擴(kuò)展枚舉的需求:
有時候希望擴(kuò)展原 enum中的元素,有時回使用子類將一個 enum 中的元素進(jìn)行分組;
2)在接口內(nèi)部,創(chuàng)建實(shí)現(xiàn)該接口的枚舉類,以此來擴(kuò)展原枚舉類:以此將元素進(jìn)行分組,達(dá)到將枚舉元素分類組織的目的;


【荔枝-在接口內(nèi)部,創(chuàng)建實(shí)現(xiàn)該接口的枚舉類,以此來擴(kuò)展原枚舉類】

// 荔枝-在接口內(nèi)部,創(chuàng)建實(shí)現(xiàn)該接口的枚舉類,以此來擴(kuò)展原枚舉類 // 將 Food 進(jìn)行分組;且所有的枚舉類都是 Food 類型 public interface Food {// 在接口內(nèi)部,創(chuàng)建實(shí)現(xiàn)該接口的內(nèi)部枚舉類,以此來擴(kuò)展原枚舉類(注意是內(nèi)部枚舉類)enum Appetizer implements Food { SALAD, SOUP, SPRING_ROLLS;}enum MainCourse implements Food {LASAGNE, BURRITO, PAD_THAI, LENTILS, HUMMOUS, VINDALOO;}enum Dessert implements Food {TIRAMISU, GELATO, BLACK_FOREST_CAKE, FRUIT, CREME_CARAMEL;}enum Coffee implements Food {BLACK_COFFEE, DECAF_COFFEE, ESPRESSO, LATTE, CAPPUCCINO, TEA, HERB_TEA;} } // /:~
【代碼解說】
解說1)實(shí)現(xiàn)接口:?
是擴(kuò)展枚舉類的唯一辦法;
解說2)上述實(shí)現(xiàn)Food接口的所有枚舉類:? 都是Food類型,屬于Food類下的多個分組;

【測試?yán)笾?在接口內(nèi)部,創(chuàng)建實(shí)現(xiàn)該接口的枚舉類,以此來擴(kuò)展原枚舉類】
//測試?yán)笾?在接口內(nèi)部,創(chuàng)建實(shí)現(xiàn)該接口的枚舉類,以此來擴(kuò)展原枚舉類 public class TypeOfFood {public static void main(String[] args) {Food food = Appetizer.SALAD;food = MainCourse.LASAGNE;food = Dessert.GELATO;food = Coffee.CAPPUCCINO;} } // /:~ 3)當(dāng)需要與一大堆類型交互時,接口沒有enum枚舉類好用


【荔枝-如何創(chuàng)建一個枚舉的枚舉類】

// 荔枝-創(chuàng)建一個枚舉的枚舉 public enum Course {APPETIZER(Food.Appetizer.class), // 這里調(diào)用的是 Course 的私有構(gòu)造器MAINCOURSE(Food.MainCourse.class), DESSERT(Food.Dessert.class), COFFEE(Food.Coffee.class);private Food[] values;// 通過 Class.getEnumConstants()方法取得所有 enum 實(shí)例private Course(Class<? extends Food> kind) { // 私有構(gòu)造器values = kind.getEnumConstants();}public Food randomSelection() {return Enums.random(values);} } // /:~ 【測試?yán)笾?創(chuàng)建一個枚舉的枚舉】
// 測試?yán)笾?創(chuàng)建一個枚舉的枚舉 public class Meal {public static void main(String[] args) {for (int i = 0; i < 5; i++) {for (Course course : Course.values()) {Food food = course.randomSelection();System.out.print(food + ", ");}System.out.println("\n----------------------------------------");}} } /* 獲得枚舉的枚舉值 SPRING_ROLLS, VINDALOO, FRUIT, DECAF_COFFEE, ---------------------------------------- SOUP, VINDALOO, FRUIT, TEA, ---------------------------------------- SALAD, BURRITO, FRUIT, TEA, ---------------------------------------- SALAD, BURRITO, CREME_CARAMEL, LATTE, ---------------------------------------- SOUP, BURRITO, TIRAMISU, ESPRESSO, ---------------------------------------- */ 4)將一個枚舉嵌套在另外一個枚舉內(nèi)部;


【荔枝-將一個枚舉嵌套在另外一個枚舉內(nèi)部】

// 荔枝-將一個枚舉嵌套在另外一個枚舉內(nèi)部; enum SecurityCategory {STOCK(Security.Stock.class), BOND(Security.Bond.class); // 兩個enum 實(shí)例Security[] values;SecurityCategory(Class<? extends Security> kind) {values = kind.getEnumConstants();}// 這個接口看做是枚舉類的集合。被嵌套在 枚舉類 SecurityCategory 的內(nèi)部interface Security {// 通過實(shí)現(xiàn)接口來擴(kuò)展枚舉實(shí)例個數(shù)enum Stock implements Security { // 內(nèi)部枚舉類SHORT, LONG, MARGIN}enum Bond implements Security {MUNICIPAL, JUNK}}public Security randomSelection() { // 隨機(jī)選擇枚舉return Enums.random(values);}public static void main(String[] args) {for (int i = 0; i < 10; i++) {SecurityCategory category = Enums.random(SecurityCategory.class); // 隨機(jī)選擇一個 SecurityCategory 枚舉實(shí)例System.out.println(category + ": " + category.randomSelection()); // 打印隨機(jī)選擇的 枚舉實(shí)例 }} } /* BOND: MUNICIPAL BOND: MUNICIPAL STOCK: MARGIN STOCK: MARGIN BOND: JUNK STOCK: SHORT STOCK: LONG STOCK: LONG BOND: MUNICIPAL BOND: JUNK */ 【代碼解說】
解說1)Security接口的作用:?
將其所包含的 enum 實(shí)例組成成公共類型;

【第二個荔枝-將一個枚舉嵌套在另外一個枚舉內(nèi)部】 ==== 1712200055
// 第二個荔枝-將一個枚舉嵌套在另外一個枚舉內(nèi)部 public enum Meal2 {// 枚舉實(shí)例序列APPETIZER(Food.Appetizer.class), MAINCOURSE(Food.MainCourse.class), DESSERT(Food.Dessert.class), COFFEE(Food.Coffee.class);private Food[] values;private Meal2(Class<? extends Food> kind) {values = kind.getEnumConstants();}public interface Food {enum Appetizer implements Food { // 枚舉類實(shí)現(xiàn)接口(內(nèi)部枚舉類)SALAD, SOUP, SPRING_ROLLS;}enum MainCourse implements Food { // 枚舉類實(shí)現(xiàn)接口(內(nèi)部枚舉類)LASAGNE, BURRITO, PAD_THAI, LENTILS, HUMMOUS, VINDALOO;}enum Dessert implements Food { // 枚舉類實(shí)現(xiàn)接口(內(nèi)部枚舉類)TIRAMISU, GELATO, BLACK_FOREST_CAKE, FRUIT, CREME_CARAMEL;}enum Coffee implements Food { // 枚舉類實(shí)現(xiàn)接口(內(nèi)部枚舉類)BLACK_COFFEE, DECAF_COFFEE, ESPRESSO, LATTE, CAPPUCCINO, TEA, HERB_TEA;}}public Food randomSelection() {return Enums.random(values);}public static void main(String[] args) {for (int i = 0; i < 5; i++) {for (Meal2 meal : Meal2.values()) {Food food = meal.randomSelection();System.out.print(food + ", ");}System.out.println("\n---------------------------------------------");}} } /* SPRING_ROLLS, VINDALOO, FRUIT, DECAF_COFFEE, --------------------------------------------- SOUP, VINDALOO, FRUIT, TEA, --------------------------------------------- SALAD, BURRITO, FRUIT, TEA, --------------------------------------------- SALAD, BURRITO, CREME_CARAMEL, LATTE, --------------------------------------------- SOUP, BURRITO, TIRAMISU, ESPRESSO, --------------------------------------------- */ 【19.8】 使用 EnumSet 替代標(biāo)志
1)枚舉類:
要求所有枚舉實(shí)例 都是唯一的,而Set保持不重復(fù)對象,所以enum類和 Set 很相像;但 enum中無法刪除和添加 枚舉實(shí)例;
2)EnumSet:java se5 引入的替代品,替代傳統(tǒng) 的基于 int 的位標(biāo)志;其優(yōu)點(diǎn)是,判斷一個二進(jìn)制位是否存在時,具有更好的表達(dá)能力,無需擔(dān)心性能;
3)EnumSet是一種容器:其元素必須來自同一個 枚舉類的實(shí)例序列;
// java.util.EnumSet 源碼 public abstract class EnumSet<E extends Enum<E>> extends AbstractSet<E>implements Cloneable, java.io.Serializable 【荔枝-EnumSet 操作枚舉實(shí)例】
// 荔枝-EnumSet 操作枚舉實(shí)例 package chapter19;//: enumerated/EnumSets.java //Operations on EnumSets import java.util.*; import static net.mindview.util.Print.*; // 這里還采用了靜態(tài)導(dǎo)入,這樣使得枚舉實(shí)例無需枚舉基類Enum修飾;前提是 枚舉類AlarmPoints 與 使用枚舉實(shí)例的類 EnumSets 在同一個包下; import static chapter19.AlarmPoints.*; public class EnumSets {public static void main(String[] args) {EnumSet<AlarmPoints> points = EnumSet.noneOf(AlarmPoints.class); // EnumSet.add(BATHROOM) 把 BATHROOM 枚舉實(shí)例 添加到 points EnumSet 容器points.add(BATHROOM);print("points.add(BATHROOM); points = " + points);// EnumSet.of(STAIR1, STAIR2, KITCHEN) 返回一個存儲了 start1,start2,start3的新EnumSetpoints.addAll(EnumSet.of(STAIR1, STAIR2, KITCHEN));print("points.addAll(EnumSet.of(STAIR1, STAIR2, KITCHEN)); points = " + points);// EnumSet.allOf(AlarmPoints.class) 返回 包含 AlarmPoints類所有的枚舉實(shí)例的新EnumSetpoints = EnumSet.allOf(AlarmPoints.class);points.removeAll(EnumSet.of(STAIR1, STAIR2, KITCHEN));print("points = EnumSet.allOf(AlarmPoints.class); "+ "points.removeAll(EnumSet.of(STAIR1, STAIR2, KITCHEN)); points = " + points);// EnumSet.range(OFFICE1, OFFICE4) 返回 包含 OFFICE1~OFFICE4(包括端點(diǎn))的枚舉實(shí)例的新EnumSetpoints.removeAll(EnumSet.range(OFFICE1, OFFICE4));print("points.removeAll(EnumSet.range(OFFICE1, OFFICE4)); points = " + points);// EnumSet.complementOf(points) 返回 points枚舉實(shí)例集合 相對于 AlarmPoints枚舉實(shí)例集合的的【補(bǔ)集】points = EnumSet.complementOf(points);print("points = EnumSet.complementOf(points); points = " + points);} } /* points.add(BATHROOM); points = [BATHROOM] points.addAll(EnumSet.of(STAIR1, STAIR2, KITCHEN)); points = [STAIR1, STAIR2, BATHROOM, KITCHEN] points = EnumSet.allOf(AlarmPoints.class); points.removeAll(EnumSet.of(STAIR1, STAIR2, KITCHEN)); points = [LOBBY, OFFICE1, OFFICE2, OFFICE3, OFFICE4, BATHROOM, UTILITY] points.removeAll(EnumSet.range(OFFICE1, OFFICE4)); points = [LOBBY, BATHROOM, UTILITY] points = EnumSet.complementOf(points); points = [STAIR1, STAIR2, OFFICE1, OFFICE2, OFFICE3, OFFICE4, KITCHEN] */ 【代碼解說】 EnumSet 方法列表如下:
EnumSet.add(BATHROOM)?
把 BATHROOM 枚舉實(shí)例 添加到 points EnumSet 容器
EnumSet.of(STAIR1, STAIR2, KITCHEN)? 返回一個存儲了 start1,start2,start3的新EnumSet
EnumSet.of(T... array)? EnumSet.f() 方法有很多重載版本;
EnumSet.allOf(AlarmPoints.class)??返回 包含 AlarmPoints類所有的枚舉實(shí)例的新EnumSet
EnumSet.range(OFFICE1, OFFICE4)? 返回 包含 OFFICE1~OFFICE4(包括端點(diǎn))的枚舉實(shí)例的新EnumSet
EnumSet.complementOf(points)??返回 points枚舉實(shí)例集合 相對于 AlarmPoints枚舉實(shí)例集合的的【補(bǔ)集】

4)EnumSet是基于long類型的,long有64位,而一個enum實(shí)例只需要一位 bit 表示其是否存在。?即EnumSet 最多可以存儲 不多于64個 enum 實(shí)例。
5)如果EnumSet 存儲的元素超過64個,怎么辦?


【荔枝-如果EnumSet 存儲的元素超過64個】

// 荔枝-如果EnumSet 存儲的元素超過64個,EnumSet還是可以存儲超過64個的 enum 枚舉實(shí)例 public class BigEnumSet {enum Big { A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10,A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21,A22, A23, A24, A25, A26, A27, A28, A29, A30, A31, A32,A33, A34, A35, A36, A37, A38, A39, A40, A41, A42, A43,A44, A45, A46, A47, A48, A49, A50, A51, A52, A53, A54,A55, A56, A57, A58, A59, A60, A61, A62, A63, A64, A65,A66, A67, A68, A69, A70, A71, A72, A73, A74, A75 }public static void main(String[] args) {EnumSet<Big> bigEnumSet = EnumSet.allOf(Big.class);System.out.println(bigEnumSet);} } /* Output: [A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21, A22, A23, A24, A25, A26, A27, A28, A29, A30, A31, A32, A33, A34, A35, A36, A37, A38, A39, A40, A41, A42, A43, A44, A45, A46, A47, A48, A49, A50, A51, A52, A53, A54, A55, A56, A57, A58, A59, A60, A61, A62, A63, A64, A65, A66, A67, A68, A69, A70, A71, A72, A73, A74, A75] *///:~ 【19.9】使用 EnumMap
1)EnumMap:?
要求鍵必須來自同一個 enum類的枚舉實(shí)例,EnumMap在內(nèi)部可以有數(shù)組實(shí)現(xiàn);
// java.util.EnumMap 源碼 public class EnumMap<K extends Enum<K>, V> extends AbstractMap<K, V>implements java.io.Serializable, Cloneable 【荔枝-EnumMap存儲和操作枚舉實(shí)例(這里采用了命令設(shè)計模式)】
// 命令接口 interface Command {void action(); } // 荔枝-EnumMap存儲和操作枚舉實(shí)例(這里采用了命令設(shè)計模式) public class EnumMaps {public static void main(String[] args) {EnumMap<AlarmPoints, Command> em = new EnumMap<AlarmPoints, Command>(AlarmPoints.class);em.put(KITCHEN, new Command() { // 匿名內(nèi)部類public void action() {print("Kitchen fire!");}});em.put(BATHROOM, new Command() { // 匿名內(nèi)部類public void action() {print("Bathroom alert!");}});// 遍歷 EnumMapfor (Map.Entry<AlarmPoints, Command> e : em.entrySet()) {printnb(e.getKey() + ": ");e.getValue().action();}try { // If there's no value for a particular key:em.get(UTILITY).action(); // 如果get()方法中的鍵值不存在,則報空指針異常} catch (Exception e) {print(e);}} } /* BATHROOM: Bathroom alert! KITCHEN: Kitchen fire! java.lang.NullPointerException */ 【代碼解說】
解說1) 與 EnumSet一樣:
enum實(shí)例定義時的順序決定了該enum實(shí)例在 EnumMap? 中的存儲順序;
解說2) EnumMap的優(yōu)點(diǎn): 與常量相比, 常量在編譯期就被固定了,是不能修改的;即使EnumMap的鍵無法修改但允許修改值對象(EnumMap的鍵固定而值可變);
解說3)多路分發(fā):?可以利用 EnumMap 實(shí)現(xiàn)多路分發(fā);

【19.10】常量相關(guān)的方法
1)java 枚舉類機(jī)制:?
允許為 每個 enum 實(shí)例編寫不同的抽象方法實(shí)現(xiàn),從而賦予每個 enum 實(shí)例不同的行為;
2)如何實(shí)現(xiàn)常量相關(guān)的方法:?需要為 enum 定義一個或多個 abstract方法,然后為每個 enum 實(shí)例實(shí)現(xiàn)該抽象方法;


【荔枝-實(shí)現(xiàn)常量相關(guān)的方法(通過枚舉類間接實(shí)現(xiàn)多態(tài))】

// 荔枝-為每個 enum 實(shí)例編寫不同的抽象方法實(shí)現(xiàn)(實(shí)現(xiàn)的方法,就是常量相關(guān)的方法,因?yàn)槊杜e類中的實(shí)例是 final 類型,這可以通過 javap 反編譯 enum類來實(shí)現(xiàn)) public enum ConstantSpecificMethod {// 為 每個 enum 實(shí)例編寫不同的抽象方法實(shí)現(xiàn)DATE_TIME {String getInfo() {return DateFormat.getDateInstance().format(new Date());}},CLASSPATH {String getInfo() {return System.getenv("CLASSPATH");}},VERSION {String getInfo() {return System.getProperty("java.version");}};abstract String getInfo(); // 抽象方法public static void main(String[] args) {// enum實(shí)例的 values() 和 valueof()方法是 編譯器為 enum 實(shí)例添加的for (ConstantSpecificMethod csm : values())System.out.println(csm.getInfo());} } /*2017-12-21 .;D:\java\jdk1.8.0_91\lib\tools.jar;D:\java\jdk1.8.0_91\lib\dt.jar; 1.8.0_91 */ 【注意】?請比較 ConstantSpecificMethod 與 命令設(shè)計模式 EnumMaps 類的相似之處;

3)無法將 enum 實(shí)例 作為一個類型來使用


【荔枝-無法將 enum 實(shí)例 作為一個類型來使用】

// 荔枝-無法將 enum 實(shí)例 作為一個類型來使用 enum LikeClasses {WINKEN {void behavior() {print("Behavior1");}},BLINKEN {void behavior() {print("Behavior2");}},NOD {void behavior() {print("Behavior3");}};abstract void behavior(); }public class NotClasses {// 無法使用 LikeClasses.WINKEN 來聲明對象引用 // void f1(LikeClasses.WINKEN instance) {} // Nope } /* 反編譯結(jié)果如下: E:\bench-cluster\spring_in_action_eclipse\AThinkingInJava\src>javac -encoding utf-8 chapter19/NotClasses.javaE:\bench-cluster\spring_in_action_eclipse\AThinkingInJava\src>javap chapter19.NotClasses Compiled from "NotClasses.java" public class chapter19.NotClasses {public chapter19.NotClasses(); }E:\bench-cluster\spring_in_action_eclipse\AThinkingInJava\src>javap chapter19.LikeClasses Compiled from "NotClasses.java" abstract class chapter19.LikeClasses extends java.lang.Enum<chapter19.LikeClasses> {public static final chapter19.LikeClasses WINKEN;public static final chapter19.LikeClasses BLINKEN;public static final chapter19.LikeClasses NOD;public static chapter19.LikeClasses[] values();public static chapter19.LikeClasses valueOf(java.lang.String);abstract void behavior();chapter19.LikeClasses(java.lang.String, int, chapter19.LikeClasses$1);static {}; } */ 【代碼解說】
解說1)通過反編譯的結(jié)果知:?
每個enum元素都是 LikeClasses 類型的 static final 實(shí)例;
解說2)因?yàn)樗鼈兪莝tatic實(shí)例,所以無法訪問外部類的 非static 元素或方法:?所以對于內(nèi)部的enum 實(shí)例來說,其行為與一般的內(nèi)部類并不相同;

【荔枝-將一個常量相關(guān)的方法關(guān)聯(lián)到選擇上,再使用 EnumSet保存客戶選擇】
// 荔枝-將一個常量相關(guān)的方法關(guān)聯(lián)到選擇上,再使用 EnumSet保存客戶選擇 public class CarWash {public enum Cycle { // enum 類UNDERBODY { // 每個enum實(shí)例編寫不同的抽象方法實(shí)現(xiàn)// 常量相關(guān)的方法,因?yàn)?UNDERBODY 的類型是 public static final chapter19.CarWash$Cycle UNDERBODY; (static final 是常量類)void action() { print("Spraying the underbody");}},WHEELWASH {void action() { // 常量相關(guān)的方法print("Washing the wheels");}},PREWASH {void action() { print("Loosening the dirt");}},BASIC {void action() { // 常量相關(guān)的方法print("The basic wash");}},HOTWAX {void action() { // 常量相關(guān)的方法print("Applying hot wax");}},RINSE {void action() { // 常量相關(guān)的方法print("Rinsing");}},BLOWDRY {void action() { // 常量相關(guān)的方法print("Blowing dry");}};abstract void action();}// EnumSet.of() 有很多重載方法,可以傳入多個 enum實(shí)例進(jìn)行存儲EnumSet<Cycle> cycles = EnumSet.of(Cycle.BASIC, Cycle.RINSE);public void add(Cycle cycle) {cycles.add(cycle);}// 遍歷 EnumSet 中的 enum 實(shí)例public void washCar() {for (Cycle c : cycles) c.action();}public String toString() {return cycles.toString();}public static void main(String[] args) {CarWash wash = new CarWash();print("wash = " + wash);print("\nwash.washCar() = ");wash.washCar(); // 遍歷 EnumSet 中的 enum 實(shí)例// 元素被添加的順序 并不決定其 存儲順序wash.add(Cycle.BLOWDRY);wash.add(Cycle.BLOWDRY); // 重復(fù)元素被忽略wash.add(Cycle.RINSE);wash.add(Cycle.HOTWAX);print("wash = " + wash);print("\nwash.washCar() = ");wash.washCar();} } /* wash = [BASIC, RINSE]wash.washCar() = The basic wash Rinsing wash = [BASIC, HOTWAX, RINSE, BLOWDRY]wash.washCar() = The basic wash Applying hot wax Rinsing Blowing dry */ /* 反編譯結(jié)果: E:\bench-cluster\spring_in_action_eclipse\AThinkingInJava\src>javac -encoding utf-8 chapter19/CarWash.javaE:\bench-cluster\spring_in_action_eclipse\AThinkingInJava\src>javap chapter19.CarWash$Cycle Compiled from "CarWash.java" public abstract class chapter19.CarWash$Cycle extends java.lang.Enum<chapter19.CarWash$Cycle> {public static final chapter19.CarWash$Cycle UNDERBODY;public static final chapter19.CarWash$Cycle WHEELWASH;public static final chapter19.CarWash$Cycle PREWASH;public static final chapter19.CarWash$Cycle BASIC;public static final chapter19.CarWash$Cycle HOTWAX;public static final chapter19.CarWash$Cycle RINSE;public static final chapter19.CarWash$Cycle BLOWDRY;public static chapter19.CarWash$Cycle[] values();public static chapter19.CarWash$Cycle valueOf(java.lang.String);abstract void action();chapter19.CarWash$Cycle(java.lang.String, int, chapter19.CarWash$1);static {}; } */ 【代碼解說】
解說1)
與使用匿名內(nèi)部類相比較,定義常量相關(guān)的方法的語法更高效和簡潔;
解說2)EnumSet 不存儲重復(fù)的 enum 實(shí)例,所以對同一個 enum實(shí)例調(diào)用兩次 add() 方法,大于等于第2次的add()方法調(diào)用都會被忽略;
解說3)向EnumSet 添加元素的順序并不能決定其在 EnumSet中的存儲順序,其存儲順序 決定于 enum 實(shí)例定義時的順序;

4)覆蓋 enum實(shí)例的常量相關(guān)的方法;因?yàn)?enum實(shí)例的類型是 static final enum類型,靜態(tài)常量枚舉類型;


【荔枝-覆蓋 enum實(shí)例的常量相關(guān)的方法】

// 荔枝-覆蓋 enum實(shí)例的常量相關(guān)的方法 public enum OverrideConstantSpecific {NUT, // 默認(rèn)方法BOLT, // 默認(rèn)方法 WASHER { // 重載方法// 這是赤裸裸的覆蓋 常量相關(guān)的方法啊。@Overridevoid f() {print("Overridden method");}};void f() {print("default behavior");}public static void main(String[] args) {for (OverrideConstantSpecific ocs : values()) {printnb(ocs + ": ");ocs.f();}} } /* NUT: default behavior BOLT: default behavior WASHER: Overridden method */ 【19.10.1】基于enum的職責(zé)鏈(職責(zé)鏈設(shè)計模式)
1)職責(zé)鏈設(shè)計模式:
當(dāng)一個請求到來時,它遍歷這個鏈,直到鏈中的某個解決方法能夠處理該請求;


【荔枝-使用enum實(shí)現(xiàn)職責(zé)鏈】

/* 荔枝-使用enum實(shí)現(xiàn)職責(zé)鏈 */ class Mail {// The NO's lower the probability of random selection:enum GeneralDelivery {YES,NO1,NO2,NO3,NO4,NO5} // 枚舉實(shí)例序列enum Scannability {UNSCANNABLE,YES1,YES2,YES3,YES4} // 枚舉實(shí)例序列enum Readability {ILLEGIBLE,YES1,YES2,YES3,YES4} // 枚舉實(shí)例序列enum Address {INCORRECT,OK1,OK2,OK3,OK4,OK5,OK6} // 枚舉實(shí)例序列enum ReturnAddress {MISSING,OK1,OK2,OK3,OK4,OK5} // 枚舉實(shí)例序列GeneralDelivery generalDelivery;Scannability scannability;Readability readability;Address address;ReturnAddress returnAddress;static long counter = 0;long id = counter++;public String toString() { return "Mail " + id; }public String details() {return toString() +", General Delivery: " + generalDelivery +", Address Scanability: " + scannability +", Address Readability: " + readability +", Address Address: " + address +", Return address: " + returnAddress;}// 產(chǎn)生一個包含隨機(jī)enum實(shí)例的Mail對象public static Mail randomMail() {Mail m = new Mail();m.generalDelivery= Enums.random(GeneralDelivery.class);m.scannability = Enums.random(Scannability.class);m.readability = Enums.random(Readability.class);m.address = Enums.random(Address.class);m.returnAddress = Enums.random(ReturnAddress.class);return m;}// 遍歷 Mail 對象的迭代器(遍歷下一個元素,通過調(diào)用randomMail() 來實(shí)現(xiàn)。 )public static Iterable<Mail> generator(final int count) {return new Iterable<Mail>() { // 匿名內(nèi)部類int n = count;public Iterator<Mail> iterator() {return new Iterator<Mail>() {public boolean hasNext() { return n-- > 0; }public Mail next() { return randomMail(); } // 產(chǎn)生一個包含隨機(jī)enum實(shí)例的Mail對象public void remove() { // Not implementedthrow new UnsupportedOperationException();}};}};} } // PostOffice類內(nèi)部 封裝了多個枚舉類 public class PostOffice {enum MailHandler {GENERAL_DELIVERY {@Overrideboolean handle(Mail m) { // 3.這是重寫 enum 常量相關(guān)的方法switch(m.generalDelivery) {case YES:print("Using general delivery for " + m);return true;default: return false;}}},MACHINE_SCAN {@Overrideboolean handle(Mail m) { // 3.這是重寫 enum 常量相關(guān)的方法switch(m.scannability) {case UNSCANNABLE: return false;default:switch(m.address) {case INCORRECT: return false;default:print("Delivering "+ m + " automatically");return true;}}}},VISUAL_INSPECTION {@Overrideboolean handle(Mail m) { // 3.這是重寫 enum 常量相關(guān)的方法switch(m.readability) {case ILLEGIBLE: return false;default:switch(m.address) {case INCORRECT: return false;default:print("Delivering " + m + " normally");return true;}}}},RETURN_TO_SENDER {@Overrideboolean handle(Mail m) { // 3.這是重寫 enum 常量相關(guān)的方法switch(m.returnAddress) {case MISSING: return false;default:print("Returning " + m + " to sender");return true;}}};abstract boolean handle(Mail m); // 抽象方法}// 2.靜態(tài)方法static void handle(Mail m) {for(MailHandler handler : MailHandler.values())// 調(diào)用被覆蓋的常量相關(guān)的方法,如果能夠處理(返回true),則停止遍歷職責(zé)鏈if(handler.handle(m)) return;print(m + " is a dead letter");}public static void main(String[] args) {for(Mail mail : Mail.generator(10)) {print(mail.details()); // 調(diào)用 Mail.toString() 方法handle(mail); // 1.靜態(tài)方法print("*****");}} } /* Mail 0, General Delivery: NO2, Address Scanability: UNSCANNABLE, Address Readability: YES3, Address Address: OK1, Return address: OK1 Delivering Mail 0 normally ***** Mail 1, General Delivery: NO5, Address Scanability: YES3, Address Readability: ILLEGIBLE, Address Address: OK5, Return address: OK1 Delivering Mail 1 automatically ***** Mail 2, General Delivery: YES, Address Scanability: YES3, Address Readability: YES1, Address Address: OK1, Return address: OK5 Using general delivery for Mail 2 ***** Mail 3, General Delivery: NO4, Address Scanability: YES3, Address Readability: YES1, Address Address: INCORRECT, Return address: OK4 Returning Mail 3 to sender ***** Mail 4, General Delivery: NO4, Address Scanability: UNSCANNABLE, Address Readability: YES1, Address Address: INCORRECT, Return address: OK2 Returning Mail 4 to sender ***** Mail 5, General Delivery: NO3, Address Scanability: YES1, Address Readability: ILLEGIBLE, Address Address: OK4, Return address: OK2 Delivering Mail 5 automatically ***** Mail 6, General Delivery: YES, Address Scanability: YES4, Address Readability: ILLEGIBLE, Address Address: OK4, Return address: OK4 Using general delivery for Mail 6 ***** Mail 7, General Delivery: YES, Address Scanability: YES3, Address Readability: YES4, Address Address: OK2, Return address: MISSING Using general delivery for Mail 7 ***** Mail 8, General Delivery: NO3, Address Scanability: YES1, Address Readability: YES3, Address Address: INCORRECT, Return address: MISSING Mail 8 is a dead letter // Mail 8 對象是 職責(zé)鏈無法解決的。 ***** Mail 9, General Delivery: NO1, Address Scanability: UNSCANNABLE, Address Readability: YES2, Address Address: OK1, Return address: OK4 Delivering Mail 9 normally ***** */ 【代碼解說】
解說1)
以上職責(zé)鏈由 enum MailHandler實(shí)現(xiàn),而 enum定義的枚舉實(shí)例次序決定了各個策略在應(yīng)用時的次序;

【19.10.2】使用enum的狀態(tài)機(jī)(狀態(tài)設(shè)計模式:如成都各大高校中的米源自動售貨機(jī))
1)枚舉類型非常適合用來創(chuàng)建狀態(tài)機(jī):?一個狀態(tài)機(jī)有有限個狀態(tài)。?
狀態(tài)機(jī)通常根據(jù)輸入,從一個狀態(tài)轉(zhuǎn)移到下一個狀態(tài)。也有瞬時狀態(tài),一旦任務(wù)結(jié)束,狀態(tài)機(jī)就離開瞬時狀態(tài);


【狀態(tài)機(jī)荔枝-自動售貨機(jī)】

// 狀態(tài)機(jī)荔枝-自動售貨機(jī)(枚舉類和枚舉實(shí)例) public enum Input {NICKEL(5), DIME(10), QUARTER(25), DOLLAR(100),TOOTHPASTE(200), CHIPS(75), SODA(100), SOAP(50),ABORT_TRANSACTION {public int amount() { // 重寫常量相關(guān)的方法throw new RuntimeException("ABORT.amount()");}},STOP { public int amount() { // 重寫常量相關(guān)的方法throw new RuntimeException("SHUT_DOWN.amount()");}}; int value; // In centsInput(int value) { this.value = value; }Input() {}int amount() { return value; }; // In centsstatic Random rand = new Random(47);public static Input randomSelection() {// Don't include STOP:return values()[rand.nextInt(values().length - 1)];} } ///:~ // 荔枝-自動販賣機(jī)開始 package chapter19; import java.io.File; import java.util.*;import net.mindview.util.*; import static chapter19.Input.*; // 靜態(tài)導(dǎo)入,主要枚舉實(shí)例無需枚舉類修飾 import static net.mindview.util.Print.*;enum Category {// 枚舉實(shí)例序列: MONEY是Category的枚舉實(shí)例,而NICKEL等是 Input的枚舉實(shí)例MONEY(NICKEL, DIME, QUARTER, DOLLAR), // 把MONEY NICKEL, DIME, QUARTER, DOLLAR 作為 EnumMap的4個key,而把MONEY 作為值(4個鍵對應(yīng)一個值)插入到EnumMap中ITEM_SELECTION(TOOTHPASTE, CHIPS, SODA, SOAP),QUIT_TRANSACTION(ABORT_TRANSACTION),SHUT_DOWN(STOP);private Input[] values;Category(Input... types) { // 構(gòu)造方法values = types; // 這里的values 就是插入到 EnumMap的values} // 使用 EnumMap 作為枚舉實(shí)例的容器private static EnumMap<Input,Category> categories = new EnumMap<Input,Category>(Input.class);static { // 靜態(tài)塊for(Category c : Category.class.getEnumConstants())for(Input type : c.values)categories.put(type, c); // 把Input枚舉實(shí)例作為鍵 和 把Category枚舉實(shí)例作為值插入到EnumMap中}public static Category categorize(Input input) {return categories.get(input); // 在EnumMap中獲取以input枚舉實(shí)例作為鍵的 Category 值;} } // 荔枝-自動販賣機(jī) public class VendingMachine {public static final String path = System.getProperty("user.dir") + File.separator + "chapter19" + File.separator; private static State state = State.RESTING;private static int amount = 0;private static Input selection = null;enum StateDuration { TRANSIENT } // StateDuration 也是枚舉類,其只有TRANSIENT 這一個枚舉實(shí)例; enum State { // State 枚舉類聲明開始RESTING { // 枚舉實(shí)例,并重寫State枚舉類的next()方法void next(Input input) {// Category.categorize(input): 在EnumMap中獲取以input枚舉實(shí)例作為鍵的 Category 值switch(Category.categorize(input)) {case MONEY:amount += input.amount();state = ADDING_MONEY;break;case SHUT_DOWN:state = TERMINAL; // 停止default:}}}, ADDING_MONEY { // 枚舉實(shí)例,并重寫State枚舉類的next()方法void next(Input input) {switch(Category.categorize(input)) {case MONEY:amount += input.amount();break;case ITEM_SELECTION:selection = input;if(amount < selection.amount())print("Insufficient money for " + selection);else state = DISPENSING;break;case QUIT_TRANSACTION:state = GIVING_CHANGE;break;case SHUT_DOWN:state = TERMINAL; // 停止default:}}}, // 調(diào)用 State 有參構(gòu)造方法DISPENSING(StateDuration.TRANSIENT) { // 枚舉實(shí)例,并重寫State枚舉類的next()方法void next() {print("here is your " + selection);amount -= selection.amount();state = GIVING_CHANGE;}},GIVING_CHANGE(StateDuration.TRANSIENT) { // 枚舉實(shí)例,并重寫State枚舉類的next()方法void next() {if(amount > 0) {print("Your change: " + amount);amount = 0;}state = RESTING;}}, TERMINAL { void output() { print("Halted"); } }; // 枚舉實(shí)例,并重寫State枚舉類的output()方法private boolean isTransient = false; // 是否是瞬時狀態(tài)State() {} // State 無參構(gòu)造方法State(StateDuration trans) { isTransient = true; } // State 有參構(gòu)造方法(只有調(diào)用有參的State構(gòu)造器,才會進(jìn)入瞬時狀態(tài))void next(Input input) { // 枚舉實(shí)例不重寫枚舉類State的 next(Input input) 方法就拋異常throw new RuntimeException("Only call " +"next(Input input) for non-transient states");}void next() { // 枚舉實(shí)例不重寫枚舉類State的 next() 方法就拋異常throw new RuntimeException("Only call next() for " +"StateDuration.TRANSIENT states");}void output() { print(amount); }} // State 枚舉類聲明結(jié)束static void run(Generator<Input> gen) { // VendingMachine 的靜態(tài)方法while(state != State.TERMINAL) {state.next(gen.next()); // gen.next() 返回 Input 枚舉類中名為 input.next()=文件中的下一個字符串 的Input類型的枚舉實(shí)例while(state.isTransient) // 只要state 不是 DISPENSING 或 GIVING_CHANGE 枚舉實(shí)例,state.isTransient始終未falsestate.next();state.output(); // 只有 TERMINAL State枚舉實(shí)例重寫了 output() 方法}}public static void main(String[] args) {Generator<Input> gen = new RandomInputGenerator();args = new String[]{"",""};if(args.length == 1)gen = new FileInputGenerator(path + "VendingMachineInput.txt");run(gen);} } // For a basic sanity check: class RandomInputGenerator implements Generator<Input> {public Input next() { return Input.randomSelection(); } }// Create Inputs from a file of ';'-separated strings: class FileInputGenerator implements Generator<Input> {private Iterator<String> input;public FileInputGenerator(String fileName) { // 構(gòu)造器input = new TextFile(fileName, ";").iterator();}public Input next() { // 隨機(jī)輸入生成器的next()方法if(!input.hasNext())return null;// Enum.valueOf(Input.class, input.next().trim()) 返回 Input 枚舉類中名為 input.next()=文件中的下一個字符串 的Input類型的枚舉實(shí)例return Enum.valueOf(Input.class, input.next().trim());} } /* Output: 也有可能一時半會停不下來,哈哈!! 25 50 75 here is your CHIPS 0 100 200 here is your TOOTHPASTE 0 25 35 Your change: 35 0 25 35 Insufficient money for SODA 35 60 70 75 Insufficient money for SODA 75 Your change: 75 0 Halted *///:~ /* VendingMachineInput.txt 下面是售貨機(jī)的操作類型列表 QUARTER; QUARTER; QUARTER; CHIPS; DOLLAR; DOLLAR; TOOTHPASTE; QUARTER; DIME; ABORT_TRANSACTION; QUARTER; DIME; SODA; QUARTER; DIME; NICKEL; SODA; ABORT_TRANSACTION; STOP; */ 【19.11】多路分發(fā)
1)如運(yùn)算表達(dá)式 a.plus(b):?
a 和 b的數(shù)據(jù)類型都未知,如何讓a和b參與運(yùn)算呢?即要執(zhí)行的操作包含了不止一個類型未知的對象,這里是有兩個類型未知的對象(a和b),
而java動態(tài)綁定機(jī)制只能處理其中一種類型,這無法解決這個問題。所以必須自定義動態(tài)綁定行為;
2)解決上面的問題是多路分發(fā):?如果要處理多個不同的類型體系,就需要為每個類型體系執(zhí)行一個方法調(diào)用。

【荔枝-使用 enum 實(shí)現(xiàn)二路分發(fā)的荔枝(經(jīng)典荔枝-基于enum的二路分發(fā))】
// Outcome.java 源碼 package chapter19;public enum Outcome { WIN, LOSE, DRAW } // 贏,輸,平局// Competitor.java 源碼 package chapter19; public interface Competitor<T extends Competitor<T>> {Outcome compete(T competitor); } ///:~// RoShamBo1.java 源碼 package chapter19;import java.util.*; import static chapter19.Outcome.*; // 靜態(tài)導(dǎo)入// 荔枝-使用 enum 實(shí)現(xiàn)二路分發(fā)的荔枝 // Item 接口 interface Item {Outcome compete(Item it);Outcome eval(Paper p);Outcome eval(Scissors s);Outcome eval(Rock r); } // Item 接口實(shí)現(xiàn)類 class Paper implements Item {// public enum Outcome { WIN, LOSE, DRAW } // 贏,輸,平局 ( Outcome 枚舉類型實(shí)例)public Outcome compete(Item it) { return it.eval(this); } // 返回 Outcome 枚舉類型實(shí)例public Outcome eval(Paper p) { return DRAW; }public Outcome eval(Scissors s) { return WIN; }public Outcome eval(Rock r) { return LOSE; }public String toString() { return "Paper"; } } //Item 接口實(shí)現(xiàn)類 class Scissors implements Item {public Outcome compete(Item it) { return it.eval(this); } // 返回 Outcome 枚舉類型實(shí)例public Outcome eval(Paper p) { return LOSE; }public Outcome eval(Scissors s) { return DRAW; }public Outcome eval(Rock r) { return WIN; }public String toString() { return "Scissors"; } } //Item 接口實(shí)現(xiàn)類 class Rock implements Item {public Outcome compete(Item it) { return it.eval(this); } // 返回 Outcome 枚舉類型實(shí)例public Outcome eval(Paper p) { return WIN; }public Outcome eval(Scissors s) { return LOSE; }public Outcome eval(Rock r) { return DRAW; }public String toString() { return "Rock"; } } public class RoShamBo1 {static final int SIZE = 20;private static Random rand = new Random(47);public static Item newItem() { // 隨機(jī)創(chuàng)建一個Item的實(shí)現(xiàn)類switch(rand.nextInt(3)) { // rand.nextInt(3) 取隨機(jī)數(shù) default:case 0: return new Scissors();case 1: return new Paper();case 2: return new Rock();}}// 比較大小public static void match(Item a, Item b) {System.out.println(a + " vs. " + b + ": " + a.compete(b)); // 相應(yīng)的Item接口實(shí)現(xiàn)類的 compete()方法}public static void main(String[] args) {for(int i = 0; i < SIZE; i++)match(newItem(), newItem());} } /* Output: Rock vs. Rock: DRAW Paper vs. Rock: WIN Paper vs. Rock: WIN Paper vs. Rock: WIN Scissors vs. Paper: WIN Scissors vs. Scissors: DRAW Scissors vs. Paper: WIN Rock vs. Paper: LOSE Paper vs. Paper: DRAW Rock vs. Paper: LOSE Paper vs. Scissors: LOSE Paper vs. Scissors: LOSE Rock vs. Scissors: WIN Rock vs. Paper: LOSE Paper vs. Rock: WIN Scissors vs. Paper: WIN Paper vs. Scissors: LOSE Paper vs. Scissors: LOSE Paper vs. Scissors: LOSE Paper vs. Scissors: LOSE *///:~ 【代碼解說】
解說1)Item是這幾種方法類型的接口,一共有三種分發(fā)類型,
所以你會看到 eval() 方法被重載了9次,因?yàn)?*3,每兩種類型的比較就可以確定一個eval()的重載版本;
解說2)可以看到,在調(diào)用 a.compete(b) 時,a和b的類型都是 Item,但具體是什么類型未知。但是通過 a 和 b的組合就可以知道調(diào)用哪一個 compete() 和 eval() 重載版本的方法;
解說3)多路分發(fā)的好處:在于保持方法調(diào)用時的優(yōu)雅語法,避免了在一個方法中判定多個對象的類型的丑陋代碼;你只需要說:嘿,你們兩個,我不在乎你們是什么類型,請自行交流; (不能再干貨-基于enum和多態(tài)的多路分發(fā)荔枝)

【19.11.1】使用enum實(shí)現(xiàn)多路分發(fā)
1)使用構(gòu)造器來初始化每個 enum 實(shí)例,并以一組結(jié)果作為參數(shù);它們的組合就形成了類似查詢表的結(jié)構(gòu):


【荔枝-使用enum實(shí)現(xiàn)多路分發(fā)】

// 荔枝-使用enum實(shí)現(xiàn)多路分發(fā) public enum RoShamBo2 implements Competitor<RoShamBo2> {// enum實(shí)例序列,調(diào)用RoShamBo2的構(gòu)造器PAPER(DRAW, LOSE, WIN), //DRAW, LOSE, WIN分布賦值給 vPAPER, vSCISSORS, vROCKSCISSORS(WIN, DRAW, LOSE), // 同理ROCK(LOSE, WIN, DRAW); // 同理private Outcome vPAPER, vSCISSORS, vROCK; // Outcome類型的枚舉實(shí)例// RoShamBo2枚舉類的構(gòu)造方法RoShamBo2(Outcome paper,Outcome scissors,Outcome rock) {this.vPAPER = paper; // 給Output實(shí)例賦值this.vSCISSORS = scissors; // 給Output實(shí)例賦值this.vROCK = rock; // 給Output實(shí)例賦值} // 重寫 compete() 比較方法@Overridepublic Outcome compete(RoShamBo2 it) {switch(it) {default:case PAPER: return vPAPER;case SCISSORS: return vSCISSORS;case ROCK: return vROCK;}}public static void main(String[] args) {RoShamBo.play(RoShamBo2.class, 20);} } /* Output: ROCK vs. ROCK: DRAW SCISSORS vs. ROCK: LOSE SCISSORS vs. ROCK: LOSE SCISSORS vs. ROCK: LOSE PAPER vs. SCISSORS: LOSE PAPER vs. PAPER: DRAW PAPER vs. SCISSORS: LOSE ROCK vs. SCISSORS: WIN SCISSORS vs. SCISSORS: DRAW ROCK vs. SCISSORS: WIN SCISSORS vs. PAPER: WIN SCISSORS vs. PAPER: WIN ROCK vs. PAPER: LOSE ROCK vs. SCISSORS: WIN SCISSORS vs. ROCK: LOSE PAPER vs. SCISSORS: LOSE SCISSORS vs. PAPER: WIN SCISSORS vs. PAPER: WIN SCISSORS vs. PAPER: WIN SCISSORS vs. PAPER: WIN *///:~ //RoShamBo.java 源碼 public class RoShamBo {// 注意方法的基于泛型的返回值類型并比較public static <T extends Competitor<T>> void match(T a, T b) {System.out.println(a + " vs. " + b + ": " + a.compete(b));}// 注意方法的基于泛型的返回值類型并比較public static <T extends Enum<T> & Competitor<T>> void play(Class<T> rsbClass, int size) {for(int i = 0; i < size; i++)match(Enums.random(rsbClass),Enums.random(rsbClass));} } ///:~ // Enums.random() 方法源碼 public class Enums {private static Random rand = new Random(47);// 通過反射 Class.getEnumConstants() 來隨機(jī)選取public static <T extends Enum<T>> T random(Class<T> ec) {// 通過 Class.getEnumConstants()方法取得所有 enum 實(shí)例return random(ec.getEnumConstants());}public static <T> T random(T[] values) {return values[rand.nextInt(values.length)]; // 隨機(jī)選取} } // /:~ 【代碼解說】
解說1)
在compete() 分發(fā)中,只要a和b的類型確定下來,就可以找到唯一的case,從而返回執(zhí)行結(jié)果;
解說2) match()方法的返回值類型是 <T extends Competitor<T>>;而play()方法的返回值類型是? <T extends Enum<T> & Competitor<T>> 注意是 <T extends Enum<T> 類型且 Competitor<T>類型;

【19.11.2】使用常量相關(guān)的方法實(shí)現(xiàn)多路分發(fā)
1)把enum 用在 switch語句中實(shí)現(xiàn)多路分發(fā),如下:


【荔枝-把enum 用在 switch語句中實(shí)現(xiàn)多路分發(fā)】

// 荔枝-把enum 用在 switch語句中實(shí)現(xiàn)多路分發(fā) public enum RoShamBo3 implements Competitor<RoShamBo3> {PAPER {public Outcome compete(RoShamBo3 it) {switch(it) {default: // To placate the compilercase PAPER: return DRAW;case SCISSORS: return LOSE;case ROCK: return WIN;}}},SCISSORS {public Outcome compete(RoShamBo3 it) {switch(it) {default:case PAPER: return WIN;case SCISSORS: return DRAW;case ROCK: return LOSE;}}},ROCK {public Outcome compete(RoShamBo3 it) {switch(it) {default:case PAPER: return LOSE;case SCISSORS: return WIN;case ROCK: return DRAW;}}};public abstract Outcome compete(RoShamBo3 it);public static void main(String[] args) {// 通過反射機(jī)制 RoShamBo3.class.getEnumConstants() 可以獲得所有的枚舉實(shí)例RoShamBo.play(RoShamBo3.class, 20); } } /* Same output as RoShamBo2.java *///:~ /* ROCK vs. ROCK: DRAW SCISSORS vs. ROCK: LOSE SCISSORS vs. ROCK: LOSE SCISSORS vs. ROCK: LOSE PAPER vs. SCISSORS: LOSE PAPER vs. PAPER: DRAW PAPER vs. SCISSORS: LOSE ROCK vs. SCISSORS: WIN SCISSORS vs. SCISSORS: DRAW ROCK vs. SCISSORS: WIN SCISSORS vs. PAPER: WIN SCISSORS vs. PAPER: WIN ROCK vs. PAPER: LOSE ROCK vs. SCISSORS: WIN SCISSORS vs. ROCK: LOSE PAPER vs. SCISSORS: LOSE SCISSORS vs. PAPER: WIN SCISSORS vs. PAPER: WIN SCISSORS vs. PAPER: WIN SCISSORS vs. PAPER: WIN */ /* public class RoShamBo {public static <T extends Competitor<T>> void match(T a, T b) {System.out.println(a + " vs. " + b + ": " + a.compete(b));}public static <T extends Enum<T> & Competitor<T>> void play(Class<T> rsbClass, int size) {for(int i = 0; i < size; i++)match(Enums.random(rsbClass),Enums.random(rsbClass));} } ///:~ */ /* // 荔枝-隨機(jī)選取 enum 實(shí)例 public class Enums {private static Random rand = new Random(47);// 通過反射 Class.getEnumConstants() 來隨機(jī)選取public static <T extends Enum<T>> T random(Class<T> ec) {// 通過 Class.getEnumConstants()方法取得所有 enum 實(shí)例return random(ec.getEnumConstants());}public static <T> T random(T[] values) {return values[rand.nextInt(values.length)]; // 隨機(jī)選取} } // /:~ */ 【荔枝-再把RoShamBo3壓縮一下】
// 荔枝-再把RoShamBo3壓縮一下 // 把enum用于switch語句實(shí)現(xiàn)多路分發(fā) public enum RoShamBo4 implements Competitor<RoShamBo4> {ROCK {public Outcome compete(RoShamBo4 opponent) {return compete(SCISSORS, opponent);}},SCISSORS {public Outcome compete(RoShamBo4 opponent) {return compete(PAPER, opponent);}},PAPER {public Outcome compete(RoShamBo4 opponent) {return compete(ROCK, opponent);}};// 執(zhí)行第二次分發(fā)// 該方法執(zhí)行一系列比較,其行為類似于 switch 語句Outcome compete(RoShamBo4 loser, RoShamBo4 opponent) {return ((opponent == this) ? Outcome.DRAW: ((opponent == loser) ? Outcome.WIN: Outcome.LOSE));}public static void main(String[] args) {RoShamBo.play(RoShamBo4.class, 20);} } /* Same output as RoShamBo2.java *///:~ /* PAPER vs. PAPER: DRAW SCISSORS vs. PAPER: WIN SCISSORS vs. PAPER: WIN SCISSORS vs. PAPER: WIN ROCK vs. SCISSORS: WIN ROCK vs. ROCK: DRAW ROCK vs. SCISSORS: WIN PAPER vs. SCISSORS: LOSE SCISSORS vs. SCISSORS: DRAW PAPER vs. SCISSORS: LOSE SCISSORS vs. ROCK: LOSE SCISSORS vs. ROCK: LOSE PAPER vs. ROCK: WIN PAPER vs. SCISSORS: LOSE SCISSORS vs. PAPER: WIN ROCK vs. SCISSORS: WIN SCISSORS vs. ROCK: LOSE SCISSORS vs. ROCK: LOSE SCISSORS vs. ROCK: LOSE SCISSORS vs. ROCK: LOSE */ 【19.11.3】使用 EnumMap 分發(fā)
1)使用 EnumMap能夠?qū)崿F(xiàn) 真正的 兩路分發(fā);


【荔枝-使用 EnumMap能夠?qū)崿F(xiàn) 真正的 兩路分發(fā)】

package chapter19; import java.util.*; import static chapter19.Outcome.*; // 靜態(tài)導(dǎo)入 Outcome 枚舉實(shí)例// public enum Outcome { WIN, LOSE, DRAW } // 贏,輸,平局 // 荔枝-使用 EnumMap能夠?qū)崿F(xiàn) 真正的 兩路分發(fā) enum RoShamBo5 implements Competitor<RoShamBo5> {PAPER, SCISSORS, ROCK;// 定義 EnumMap 類型 變量static EnumMap<RoShamBo5,EnumMap<RoShamBo5,Outcome>> table = new EnumMap<RoShamBo5, EnumMap<RoShamBo5,Outcome>>(RoShamBo5.class);static { // 靜態(tài)塊for(RoShamBo5 it : RoShamBo5.values())// 填充 EnumMap容器,其中 RoShamBo5 枚舉實(shí)例作為鍵,EnumMap作為值;table.put(it, new EnumMap<RoShamBo5,Outcome>(RoShamBo5.class));initRow(PAPER, DRAW, LOSE, WIN);initRow(SCISSORS, WIN, DRAW, LOSE);initRow(ROCK, LOSE, WIN, DRAW);} // 把 RoShamBo5枚舉實(shí)例作為鍵,static void initRow(RoShamBo5 it, Outcome vPAPER, Outcome vSCISSORS, Outcome vROCK) {EnumMap<RoShamBo5,Outcome> row = RoShamBo5.table.get(it); // 獲取 EnumMap容器(參見table容器的填充語句)// 以 RoShamBo5 枚舉實(shí)例為鍵,OutCome 枚舉實(shí)例作為值 填充 EnumMap容器row.put(RoShamBo5.PAPER, vPAPER);row.put(RoShamBo5.SCISSORS, vSCISSORS);row.put(RoShamBo5.ROCK, vROCK);}public Outcome compete(RoShamBo5 it) {return table.get(this).get(it);}public static void main(String[] args) {RoShamBo.play(RoShamBo5.class, 20);} } /* Same output as RoShamBo2.java *///:~ /* ROCK vs. ROCK: DRAW SCISSORS vs. ROCK: LOSE SCISSORS vs. ROCK: LOSE SCISSORS vs. ROCK: LOSE PAPER vs. SCISSORS: LOSE PAPER vs. PAPER: DRAW PAPER vs. SCISSORS: LOSE ROCK vs. SCISSORS: WIN SCISSORS vs. SCISSORS: DRAW ROCK vs. SCISSORS: WIN SCISSORS vs. PAPER: WIN SCISSORS vs. PAPER: WIN ROCK vs. PAPER: LOSE ROCK vs. SCISSORS: WIN SCISSORS vs. ROCK: LOSE PAPER vs. SCISSORS: LOSE SCISSORS vs. PAPER: WIN SCISSORS vs. PAPER: WIN SCISSORS vs. PAPER: WIN SCISSORS vs. PAPER: WIN */ 【19.11.4】使用二維數(shù)組
1)進(jìn)一步簡化實(shí)現(xiàn)兩路分發(fā)的解決方案。(這種方法很可能也是最快速的,因?yàn)镋numMap內(nèi)部是基于數(shù)組實(shí)現(xiàn)的)


【荔枝-使用二維數(shù)組實(shí)現(xiàn)二路分發(fā)】

// 荔枝-使用二維數(shù)組實(shí)現(xiàn)二路分發(fā) enum RoShamBo6 implements Competitor<RoShamBo6> {PAPER, SCISSORS, ROCK; // RoShamBo6 枚舉實(shí)例private static Outcome[][] table = { // Outcome 枚舉實(shí)例二維數(shù)組{ DRAW, LOSE, WIN }, // PAPER{ WIN, DRAW, LOSE }, // SCISSORS{ LOSE, WIN, DRAW }, // ROCK};public Outcome compete(RoShamBo6 other) {return table[this.ordinal()][other.ordinal()]; // ordinal 為該枚舉實(shí)例的定義順序 }public static void main(String[] args) {RoShamBo.play(RoShamBo6.class, 20);} } ///:~ /* ROCK vs. ROCK: DRAW SCISSORS vs. ROCK: LOSE SCISSORS vs. ROCK: LOSE SCISSORS vs. ROCK: LOSE PAPER vs. SCISSORS: LOSE PAPER vs. PAPER: DRAW PAPER vs. SCISSORS: LOSE ROCK vs. SCISSORS: WIN SCISSORS vs. SCISSORS: DRAW ROCK vs. SCISSORS: WIN SCISSORS vs. PAPER: WIN SCISSORS vs. PAPER: WIN ROCK vs. PAPER: LOSE ROCK vs. SCISSORS: WIN SCISSORS vs. ROCK: LOSE PAPER vs. SCISSORS: LOSE SCISSORS vs. PAPER: WIN SCISSORS vs. PAPER: WIN SCISSORS vs. PAPER: WIN SCISSORS vs. PAPER: WIN */? ?【19.12】總結(jié)
?1)
java中的枚舉比 C 胡 C++ 中的enum 更加成熟;
?2)本章正好說明了 枚舉所能帶來的價值。?有時,恰恰因?yàn)樗?#xff0c;你才可以優(yōu)雅而干凈地解決問題;
?3)java 1.0 對 術(shù)語 enumeration 的選擇正式一個不幸的反例。?對于一個專門用于從序列中選擇每一個元素的對象而言,java 1.0竟然沒有使用 俗語 iterator來表示。()
?4)java 的后序版本修正了這個錯誤。?但是 Enumeration 接口已經(jīng)無法輕易抹去;



總結(jié)

以上是生活随笔為你收集整理的thinking-in-java(19)枚举类型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

丝袜美腿亚洲一区二区 | 国产猛烈高潮尖叫视频免费 | 人人澡人人透人人爽 | 久久婷婷五月综合色国产香蕉 | 亚洲中文字幕无码一久久区 | 俺去俺来也www色官网 | 免费网站看v片在线18禁无码 | 欧美 日韩 亚洲 在线 | 狠狠色欧美亚洲狠狠色www | 成人三级无码视频在线观看 | 一本久道久久综合婷婷五月 | 蜜臀av无码人妻精品 | 嫩b人妻精品一区二区三区 | 丰满岳乱妇在线观看中字无码 | 狠狠噜狠狠狠狠丁香五月 | 国产精品99爱免费视频 | www成人国产高清内射 | 久久久久免费精品国产 | 国产热a欧美热a在线视频 | 亚洲天堂2017无码中文 | 免费无码一区二区三区蜜桃大 | 老熟女乱子伦 | 狂野欧美激情性xxxx | 亚洲爆乳精品无码一区二区三区 | 色 综合 欧美 亚洲 国产 | 精品人妻人人做人人爽 | 亚洲熟妇色xxxxx欧美老妇 | 久久精品人人做人人综合试看 | 高潮喷水的毛片 | 日本大香伊一区二区三区 | 无码人妻黑人中文字幕 | 国产成人精品一区二区在线小狼 | 亚洲成av人在线观看网址 | 亚洲精品一区二区三区四区五区 | 东京热男人av天堂 | 国产 精品 自在自线 | 日本护士毛茸茸高潮 | 给我免费的视频在线观看 | 国产av无码专区亚洲awww | 亚洲国产精品无码久久久久高潮 | 无码人妻少妇伦在线电影 | 东京热无码av男人的天堂 | 亚洲精品中文字幕乱码 | 丰满岳乱妇在线观看中字无码 | 免费无码一区二区三区蜜桃大 | 中文字幕+乱码+中文字幕一区 | www国产亚洲精品久久久日本 | 人妻互换免费中文字幕 | 十八禁视频网站在线观看 | 久久久精品人妻久久影视 | 欧美丰满熟妇xxxx性ppx人交 | 亚洲欧洲中文日韩av乱码 | 久久久久成人精品免费播放动漫 | 兔费看少妇性l交大片免费 | 在线 国产 欧美 亚洲 天堂 | 久久99精品久久久久久动态图 | 少妇性俱乐部纵欲狂欢电影 | 久久久久久亚洲精品a片成人 | 久久久久免费精品国产 | 亚洲の无码国产の无码影院 | 亚洲狠狠婷婷综合久久 | 国产亚洲精品久久久ai换 | 国产成人无码av在线影院 | 国产精品-区区久久久狼 | 99视频精品全部免费免费观看 | 国产成人人人97超碰超爽8 | 97无码免费人妻超级碰碰夜夜 | 秋霞成人午夜鲁丝一区二区三区 | 性做久久久久久久久 | 国产在线aaa片一区二区99 | 国产色xx群视频射精 | 天天摸天天透天天添 | 乱中年女人伦av三区 | 国产午夜精品一区二区三区嫩草 | 中文字幕无码日韩专区 | 在线观看国产午夜福利片 | 99国产精品白浆在线观看免费 | 白嫩日本少妇做爰 | 国产av一区二区三区最新精品 | 美女毛片一区二区三区四区 | 国产在线精品一区二区三区直播 | 蜜桃臀无码内射一区二区三区 | 国产精品第一国产精品 | 欧美国产日韩久久mv | 中文字幕日韩精品一区二区三区 | 激情综合激情五月俺也去 | 婷婷综合久久中文字幕蜜桃三电影 | 性欧美熟妇videofreesex | 精品国产青草久久久久福利 | 午夜福利不卡在线视频 | 亚洲娇小与黑人巨大交 | 97无码免费人妻超级碰碰夜夜 | 久久久亚洲欧洲日产国码αv | 国产精品久久久久久久9999 | 日日天干夜夜狠狠爱 | 亚洲国产欧美在线成人 | 国产亚洲tv在线观看 | 国产成人综合色在线观看网站 | 亚洲精品国偷拍自产在线麻豆 | 亚洲の无码国产の无码步美 | 精品熟女少妇av免费观看 | 国产女主播喷水视频在线观看 | 大屁股大乳丰满人妻 | 乱中年女人伦av三区 | 国产精品内射视频免费 | 无码一区二区三区在线观看 | 国产色在线 | 国产 | 青青青爽视频在线观看 | 大乳丰满人妻中文字幕日本 | 好爽又高潮了毛片免费下载 | 国产内射爽爽大片视频社区在线 | 在线观看国产一区二区三区 | 中文字幕亚洲情99在线 | 久久久久se色偷偷亚洲精品av | 免费网站看v片在线18禁无码 | 99久久精品无码一区二区毛片 | 久久精品99久久香蕉国产色戒 | 98国产精品综合一区二区三区 | 丰满妇女强制高潮18xxxx | 婷婷丁香五月天综合东京热 | 两性色午夜视频免费播放 | 亚洲色无码一区二区三区 | 亚洲精品国产品国语在线观看 | 亚洲a无码综合a国产av中文 | 色婷婷综合激情综在线播放 | 无码国产激情在线观看 | 欧美黑人性暴力猛交喷水 | yw尤物av无码国产在线观看 | 日日摸日日碰夜夜爽av | 天天拍夜夜添久久精品 | 国产免费久久久久久无码 | 1000部啪啪未满十八勿入下载 | 中文无码成人免费视频在线观看 | 玩弄中年熟妇正在播放 | 色婷婷av一区二区三区之红樱桃 | 国产精品亚洲а∨无码播放麻豆 | 亚洲 欧美 激情 小说 另类 | 99久久久无码国产精品免费 | 亚洲最大成人网站 | 精品 日韩 国产 欧美 视频 | 呦交小u女精品视频 | 国产成人无码区免费内射一片色欲 | 18禁止看的免费污网站 | 国产精品丝袜黑色高跟鞋 | 秋霞成人午夜鲁丝一区二区三区 | 九九久久精品国产免费看小说 | 国产激情无码一区二区app | 人人妻在人人 | 麻豆成人精品国产免费 | 亚洲国产欧美在线成人 | 67194成是人免费无码 | 精品国产一区二区三区av 性色 | 3d动漫精品啪啪一区二区中 | 波多野结衣aⅴ在线 | 精品久久久久久人妻无码中文字幕 | 午夜福利试看120秒体验区 | 亚洲精品成a人在线观看 | 久久综合九色综合97网 | 日本免费一区二区三区最新 | 亚洲自偷自偷在线制服 | 激情五月综合色婷婷一区二区 | 中文字幕乱码中文乱码51精品 | 亚洲综合精品香蕉久久网 | 色综合久久88色综合天天 | 国产精品香蕉在线观看 | 老子影院午夜精品无码 | 国产免费久久久久久无码 | 55夜色66夜色国产精品视频 | 久久精品国产亚洲精品 | 人妻无码αv中文字幕久久琪琪布 | 亚洲精品中文字幕 | 亚洲欧美精品aaaaaa片 | 无码一区二区三区在线观看 | 国产av无码专区亚洲awww | 人妻无码αv中文字幕久久琪琪布 | 无码人妻少妇伦在线电影 | 粗大的内捧猛烈进出视频 | 伊人久久大香线焦av综合影院 | 99久久人妻精品免费一区 | 国产97在线 | 亚洲 | 国产免费久久久久久无码 | 中文字幕无码乱人伦 | 55夜色66夜色国产精品视频 | 在线观看国产午夜福利片 | 欧美日韩色另类综合 | 亚洲天堂2017无码中文 | 娇妻被黑人粗大高潮白浆 | 天天躁日日躁狠狠躁免费麻豆 | 秋霞成人午夜鲁丝一区二区三区 | 男女猛烈xx00免费视频试看 | 免费国产黄网站在线观看 | 久久99精品国产麻豆蜜芽 | 欧美日韩亚洲国产精品 | 免费国产成人高清在线观看网站 | 日本成熟视频免费视频 | 亚洲欧美综合区丁香五月小说 | 国产精品永久免费视频 | 亚洲日韩乱码中文无码蜜桃臀网站 | 天天摸天天碰天天添 | 扒开双腿疯狂进出爽爽爽视频 | 国语精品一区二区三区 | 欧美大屁股xxxxhd黑色 | 日产精品高潮呻吟av久久 | 亚洲精品一区二区三区在线观看 | 亚洲欧美国产精品专区久久 | 图片小说视频一区二区 | 国产精品国产自线拍免费软件 | 日韩成人一区二区三区在线观看 | 亚洲欧洲无卡二区视頻 | 色婷婷久久一区二区三区麻豆 | 国产综合在线观看 | 色噜噜亚洲男人的天堂 | 亚洲色偷偷男人的天堂 | 18黄暴禁片在线观看 | 亚洲成av人在线观看网址 | 国产莉萝无码av在线播放 | 中文字幕乱码人妻无码久久 | 六月丁香婷婷色狠狠久久 | 中文字幕人妻丝袜二区 | 亚洲中文字幕在线无码一区二区 | 国产在线无码精品电影网 | 99精品国产综合久久久久五月天 | 亚洲の无码国产の无码步美 | 三上悠亚人妻中文字幕在线 | 啦啦啦www在线观看免费视频 | 丰满少妇高潮惨叫视频 | 亚洲一区二区三区国产精华液 | 亚洲国精产品一二二线 | 国产成人综合在线女婷五月99播放 | 国产精品无码mv在线观看 | 日韩精品无码一本二本三本色 | 在线播放免费人成毛片乱码 | 国内少妇偷人精品视频 | 亚洲中文字幕成人无码 | 国产精品怡红院永久免费 | 亚洲熟妇色xxxxx欧美老妇 | 欧美三级a做爰在线观看 | 亚洲日韩一区二区三区 | 午夜精品一区二区三区在线观看 | 日韩在线不卡免费视频一区 | 久久人人爽人人爽人人片ⅴ | 午夜性刺激在线视频免费 | 天堂在线观看www | 野外少妇愉情中文字幕 | a片免费视频在线观看 | 天天做天天爱天天爽综合网 | 国产免费观看黄av片 | 日本一区二区三区免费高清 | 国产人妻久久精品二区三区老狼 | 成人亚洲精品久久久久 | 亚洲熟女一区二区三区 | 亚洲熟悉妇女xxx妇女av | 青青草原综合久久大伊人精品 | 精品国产精品久久一区免费式 | 久久综合色之久久综合 | 亚洲人成网站免费播放 | 国产97人人超碰caoprom | 香蕉久久久久久av成人 | 精品一区二区三区无码免费视频 | 久久久精品国产sm最大网站 | 午夜成人1000部免费视频 | 国产精品久久久久影院嫩草 | 熟女少妇人妻中文字幕 | 亚洲色偷偷男人的天堂 | 亚洲熟女一区二区三区 | 色情久久久av熟女人妻网站 | 国产精品视频免费播放 | 香蕉久久久久久av成人 | 亚洲色成人中文字幕网站 | 国产精品久久国产精品99 | 国产av人人夜夜澡人人爽麻豆 | 天天躁日日躁狠狠躁免费麻豆 | 99精品国产综合久久久久五月天 | 一个人免费观看的www视频 | 嫩b人妻精品一区二区三区 | 成人试看120秒体验区 | 色老头在线一区二区三区 | 国产成人无码区免费内射一片色欲 | 亚洲国产精品无码一区二区三区 | 成熟女人特级毛片www免费 | 狂野欧美性猛xxxx乱大交 | 女人被男人躁得好爽免费视频 | 久久久久久久女国产乱让韩 | 特黄特色大片免费播放器图片 | 国产xxx69麻豆国语对白 | 色狠狠av一区二区三区 | 国产精品久久国产三级国 | 国产内射老熟女aaaa | 福利一区二区三区视频在线观看 | 久久aⅴ免费观看 | 99国产欧美久久久精品 | 无码成人精品区在线观看 | 国产亚洲精品久久久久久 | 偷窥日本少妇撒尿chinese | 亚洲精品综合五月久久小说 | 天天av天天av天天透 | 亚洲精品一区三区三区在线观看 | 4hu四虎永久在线观看 | 色婷婷综合激情综在线播放 | 成人无码视频免费播放 | 妺妺窝人体色www在线小说 | 色爱情人网站 | 男人和女人高潮免费网站 | 人妻少妇被猛烈进入中文字幕 | 人妻中文无码久热丝袜 | 少妇久久久久久人妻无码 | 国产精品二区一区二区aⅴ污介绍 | 亚洲男人av香蕉爽爽爽爽 | 日本熟妇乱子伦xxxx | 无遮挡国产高潮视频免费观看 | 亚洲中文字幕乱码av波多ji | 国产麻豆精品一区二区三区v视界 | 国产熟妇高潮叫床视频播放 | 久久精品一区二区三区四区 | 中文字幕av日韩精品一区二区 | 99在线 | 亚洲 | 国产精品久久久久影院嫩草 | 一本大道久久东京热无码av | 日韩精品乱码av一区二区 | 日韩视频 中文字幕 视频一区 | 爱做久久久久久 | 久久久国产一区二区三区 | 亚洲熟妇色xxxxx亚洲 | 亚洲小说图区综合在线 | 性史性农村dvd毛片 | 免费播放一区二区三区 | 无码国内精品人妻少妇 | 亚洲日韩av片在线观看 | 国产精品无码一区二区桃花视频 | 欧美精品在线观看 | 亚洲 a v无 码免 费 成 人 a v | 国产熟妇另类久久久久 | 乱码午夜-极国产极内射 | 5858s亚洲色大成网站www | 中文字幕无码免费久久99 | 色一情一乱一伦一视频免费看 | 熟妇女人妻丰满少妇中文字幕 | 亚洲码国产精品高潮在线 | 国产成人无码av在线影院 | 2020最新国产自产精品 | 成人欧美一区二区三区黑人免费 | 99精品久久毛片a片 | 熟妇人妻激情偷爽文 | 久在线观看福利视频 | 性欧美大战久久久久久久 | 欧美日本日韩 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 中文字幕av日韩精品一区二区 | 亚洲精品美女久久久久久久 | 国产做国产爱免费视频 | 亚无码乱人伦一区二区 | 欧美人与善在线com | 亚洲欧美国产精品专区久久 | 中文字幕无码av激情不卡 | 国产午夜精品一区二区三区嫩草 | 未满成年国产在线观看 | 99国产欧美久久久精品 | 亚洲高清偷拍一区二区三区 | 色一情一乱一伦一区二区三欧美 | √8天堂资源地址中文在线 | 国产另类ts人妖一区二区 | 国产亲子乱弄免费视频 | 国产精品igao视频网 | 领导边摸边吃奶边做爽在线观看 | 欧美老熟妇乱xxxxx | 18精品久久久无码午夜福利 | 十八禁视频网站在线观看 | 2020久久超碰国产精品最新 | 老司机亚洲精品影院无码 | 亚洲人亚洲人成电影网站色 | 久久精品国产日本波多野结衣 | 亚洲国产欧美在线成人 | 女人被爽到呻吟gif动态图视看 | 国产综合在线观看 | 色狠狠av一区二区三区 | 国内精品人妻无码久久久影院 | 色婷婷av一区二区三区之红樱桃 | 一个人看的视频www在线 | 沈阳熟女露脸对白视频 | 国产尤物精品视频 | 俺去俺来也在线www色官网 | 人妻无码久久精品人妻 | 国产激情无码一区二区app | 99久久婷婷国产综合精品青草免费 | 成人精品视频一区二区三区尤物 | 中文精品无码中文字幕无码专区 | 久久人人爽人人爽人人片av高清 | 成 人 网 站国产免费观看 | www一区二区www免费 | 精品日本一区二区三区在线观看 | 粉嫩少妇内射浓精videos | 久久99精品国产.久久久久 | 精品国偷自产在线视频 | а√天堂www在线天堂小说 | 日本一区二区三区免费高清 | 亚洲国产一区二区三区在线观看 | 国内精品人妻无码久久久影院 | 日韩人妻少妇一区二区三区 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 精品人人妻人人澡人人爽人人 | 人妻无码αv中文字幕久久琪琪布 | 国产又爽又黄又刺激的视频 | 18禁黄网站男男禁片免费观看 | 女人被男人躁得好爽免费视频 | 久久久成人毛片无码 | 中文字幕乱码亚洲无线三区 | 熟妇人妻激情偷爽文 | 国产成人一区二区三区在线观看 | 麻花豆传媒剧国产免费mv在线 | 精品久久久久久亚洲精品 | 国产9 9在线 | 中文 | 十八禁真人啪啪免费网站 | 99久久久无码国产aaa精品 | 在线精品亚洲一区二区 | 国产xxx69麻豆国语对白 | 人人妻人人澡人人爽人人精品 | 日本一区二区更新不卡 | 麻豆精品国产精华精华液好用吗 | 久久国产精品_国产精品 | 久久99精品国产麻豆 | 天堂在线观看www | 亚洲色欲久久久综合网东京热 | 天堂亚洲2017在线观看 | 亚洲色在线无码国产精品不卡 | √天堂资源地址中文在线 | 国产又爽又黄又刺激的视频 | 亚洲狠狠色丁香婷婷综合 | 成人欧美一区二区三区 | 国产精品-区区久久久狼 | 日本精品少妇一区二区三区 | 精品人妻中文字幕有码在线 | 久久婷婷五月综合色国产香蕉 | 国产麻豆精品精东影业av网站 | 狠狠亚洲超碰狼人久久 | 国产无遮挡又黄又爽又色 | 草草网站影院白丝内射 | 人人妻人人澡人人爽欧美一区 | 免费国产黄网站在线观看 | 无码人妻av免费一区二区三区 | 国产亚洲精品久久久久久久 | 麻豆精产国品 | 国产麻豆精品一区二区三区v视界 | 无码人妻少妇伦在线电影 | 亚洲欧美色中文字幕在线 | 无码精品国产va在线观看dvd | 精品成在人线av无码免费看 | 对白脏话肉麻粗话av | 4hu四虎永久在线观看 | 无码av最新清无码专区吞精 | 亚洲 a v无 码免 费 成 人 a v | 狠狠色噜噜狠狠狠狠7777米奇 | 日韩人妻无码一区二区三区久久99 | 黄网在线观看免费网站 | 国产精品99久久精品爆乳 | 日本丰满熟妇videos | 中文精品久久久久人妻不卡 | 国产女主播喷水视频在线观看 | 亚洲区欧美区综合区自拍区 | 人人妻人人澡人人爽人人精品浪潮 | 国产两女互慰高潮视频在线观看 | 成熟妇人a片免费看网站 | 国产成人精品优优av | 精品无码成人片一区二区98 | 日本又色又爽又黄的a片18禁 | 天堂а√在线地址中文在线 | 亚洲精品无码国产 | 樱花草在线播放免费中文 | 亚洲性无码av中文字幕 | 东京热无码av男人的天堂 | 少妇人妻偷人精品无码视频 | 成 人 网 站国产免费观看 | 精品久久综合1区2区3区激情 | 18禁黄网站男男禁片免费观看 | 76少妇精品导航 | 性色欲网站人妻丰满中文久久不卡 | 搡女人真爽免费视频大全 | 装睡被陌生人摸出水好爽 | 少妇厨房愉情理9仑片视频 | 乱码午夜-极国产极内射 | 久久精品中文字幕大胸 | 一区二区三区乱码在线 | 欧洲 | 欧美性生交活xxxxxdddd | 久久综合九色综合97网 | 国产电影无码午夜在线播放 | 性欧美熟妇videofreesex | 亚洲国产精品无码久久久久高潮 | 久久久久99精品国产片 | 国产精品人妻一区二区三区四 | 少妇无码吹潮 | 福利一区二区三区视频在线观看 | 精品久久久久久人妻无码中文字幕 | 娇妻被黑人粗大高潮白浆 | 亚洲色www成人永久网址 | 99视频精品全部免费免费观看 | 爱做久久久久久 | 日本一区二区三区免费播放 | 东京一本一道一二三区 | 中文字幕人妻丝袜二区 | 久久国产36精品色熟妇 | 天天躁夜夜躁狠狠是什么心态 | 国产色视频一区二区三区 | 国产成人精品无码播放 | 欧美性猛交内射兽交老熟妇 | 日韩欧美中文字幕公布 | 人人澡人人妻人人爽人人蜜桃 | 久久视频在线观看精品 | 丁香啪啪综合成人亚洲 | 鲁一鲁av2019在线 | 人妻体内射精一区二区三四 | 免费观看激色视频网站 | 99久久婷婷国产综合精品青草免费 | 免费无码一区二区三区蜜桃大 | 少妇太爽了在线观看 | 少妇无套内谢久久久久 | www国产亚洲精品久久网站 | 精品国产精品久久一区免费式 | 曰韩少妇内射免费播放 | 亚洲天堂2017无码中文 | 熟妇人妻无乱码中文字幕 | av无码久久久久不卡免费网站 | 亚洲乱码中文字幕在线 | 无遮挡国产高潮视频免费观看 | 老太婆性杂交欧美肥老太 | 成人无码精品一区二区三区 | 国产美女精品一区二区三区 | 国产一区二区三区影院 | 欧美日韩综合一区二区三区 | 日本熟妇大屁股人妻 | 人人妻人人澡人人爽精品欧美 | 免费观看激色视频网站 | 欧美人妻一区二区三区 | 免费中文字幕日韩欧美 | 欧美一区二区三区视频在线观看 | 亚洲色欲色欲欲www在线 | 无码av最新清无码专区吞精 | 日本丰满护士爆乳xxxx | 国产口爆吞精在线视频 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 国产香蕉尹人综合在线观看 | 97精品人妻一区二区三区香蕉 | 国产精品嫩草久久久久 | 国产激情综合五月久久 | 中文精品无码中文字幕无码专区 | 久久久久久久久蜜桃 | 亚洲熟妇色xxxxx亚洲 | 国产另类ts人妖一区二区 | 中文字幕日韩精品一区二区三区 | 国产后入清纯学生妹 | 久久久久亚洲精品男人的天堂 | 久久这里只有精品视频9 | 四十如虎的丰满熟妇啪啪 | 亚洲国产精品久久久天堂 | 骚片av蜜桃精品一区 | 日韩精品无码免费一区二区三区 | 日韩欧美中文字幕公布 | 最新版天堂资源中文官网 | 网友自拍区视频精品 | 久久99精品久久久久久 | www国产精品内射老师 | 成人精品视频一区二区三区尤物 | 999久久久国产精品消防器材 | 一区二区传媒有限公司 | 久久久中文字幕日本无吗 | 中文字幕日韩精品一区二区三区 | 久久久久国色av免费观看性色 | 亚洲国产精品无码一区二区三区 | 又粗又大又硬毛片免费看 | 久久亚洲a片com人成 | 高清国产亚洲精品自在久久 | 婷婷综合久久中文字幕蜜桃三电影 | 波多野结衣av在线观看 | 无人区乱码一区二区三区 | 人妻少妇精品久久 | 欧美刺激性大交 | 久久精品视频在线看15 | 乱人伦人妻中文字幕无码 | 中文精品久久久久人妻不卡 | 国产成人精品一区二区在线小狼 | 精品日本一区二区三区在线观看 | 国产真实夫妇视频 | 久久久久国色av免费观看性色 | 精品无码av一区二区三区 | 欧美freesex黑人又粗又大 | 爆乳一区二区三区无码 | 一本久久伊人热热精品中文字幕 | 亚洲精品www久久久 | 午夜福利一区二区三区在线观看 | 国产精品久久久久无码av色戒 | 日韩人妻少妇一区二区三区 | 婷婷丁香五月天综合东京热 | 狠狠色噜噜狠狠狠7777奇米 | 国产人妻大战黑人第1集 | 日本护士毛茸茸高潮 | 午夜成人1000部免费视频 | 男人和女人高潮免费网站 | 荫蒂被男人添的好舒服爽免费视频 | 国内老熟妇对白xxxxhd | 伊在人天堂亚洲香蕉精品区 | 中文字幕乱妇无码av在线 | 日本精品少妇一区二区三区 | 亚洲欧美日韩国产精品一区二区 | 欧美精品免费观看二区 | 好爽又高潮了毛片免费下载 | 97久久精品无码一区二区 | 亚洲色www成人永久网址 | 国产偷抇久久精品a片69 | 大色综合色综合网站 | 人妻有码中文字幕在线 | 久久精品中文字幕一区 | 日本精品人妻无码免费大全 | 波多野结衣av在线观看 | 久久久久av无码免费网 | 久久这里只有精品视频9 | 久久精品无码一区二区三区 | 最近免费中文字幕中文高清百度 | 丰满少妇女裸体bbw | 少妇性l交大片欧洲热妇乱xxx | 夜夜躁日日躁狠狠久久av | 无码国产乱人伦偷精品视频 | 亚洲精品一区三区三区在线观看 | 乱码av麻豆丝袜熟女系列 | 青青青手机频在线观看 | 人人爽人人澡人人人妻 | 麻豆国产丝袜白领秘书在线观看 | 少妇一晚三次一区二区三区 | 55夜色66夜色国产精品视频 | 男女爱爱好爽视频免费看 | 精品无码成人片一区二区98 | 女人被男人爽到呻吟的视频 | 九一九色国产 | av在线亚洲欧洲日产一区二区 | 色婷婷综合激情综在线播放 | 亚洲 日韩 欧美 成人 在线观看 | 国产亚洲tv在线观看 | 欧美喷潮久久久xxxxx | 久久精品视频在线看15 | 真人与拘做受免费视频 | 水蜜桃亚洲一二三四在线 | 国内综合精品午夜久久资源 | 欧美老熟妇乱xxxxx | 国产综合色产在线精品 | 成人无码视频在线观看网站 | 丰满岳乱妇在线观看中字无码 | 18禁止看的免费污网站 | 国产偷抇久久精品a片69 | 超碰97人人射妻 | 国产免费久久久久久无码 | 女人高潮内射99精品 | 九九综合va免费看 | 乱人伦人妻中文字幕无码 | 亚洲国产日韩a在线播放 | 波多野42部无码喷潮在线 | 久久亚洲日韩精品一区二区三区 | 精品国偷自产在线视频 | 国产成人午夜福利在线播放 | 性开放的女人aaa片 | 日韩精品a片一区二区三区妖精 | 久久久久99精品国产片 | 亚拍精品一区二区三区探花 | 欧美老妇交乱视频在线观看 | 国产精品无码一区二区三区不卡 | 麻豆蜜桃av蜜臀av色欲av | 欧洲vodafone精品性 | 久久精品女人天堂av免费观看 | 久久午夜夜伦鲁鲁片无码免费 | 久精品国产欧美亚洲色aⅴ大片 | 无码精品国产va在线观看dvd | 少妇性l交大片欧洲热妇乱xxx | 国产欧美亚洲精品a | 欧美喷潮久久久xxxxx | 装睡被陌生人摸出水好爽 | 欧美乱妇无乱码大黄a片 | 人妻与老人中文字幕 | 精品水蜜桃久久久久久久 | 少妇太爽了在线观看 | 久久人妻内射无码一区三区 | 日本又色又爽又黄的a片18禁 | 亚洲色大成网站www | 国产乱人伦av在线无码 | 国产性生大片免费观看性 | 亚洲精品国产第一综合99久久 | 亚洲精品国产精品乱码视色 | 国产香蕉97碰碰久久人人 | 少妇一晚三次一区二区三区 | 玩弄人妻少妇500系列视频 | 免费播放一区二区三区 | 国产精品久久久久无码av色戒 | 国产亲子乱弄免费视频 | 蜜桃视频插满18在线观看 | 久久国产精品精品国产色婷婷 | 无码av中文字幕免费放 | 国产亚洲欧美日韩亚洲中文色 | а√天堂www在线天堂小说 | av在线亚洲欧洲日产一区二区 | 人人爽人人爽人人片av亚洲 | 国产成人精品优优av | 精品无码国产自产拍在线观看蜜 | 日日碰狠狠躁久久躁蜜桃 | 秋霞成人午夜鲁丝一区二区三区 | 国语精品一区二区三区 | 性生交大片免费看女人按摩摩 | 55夜色66夜色国产精品视频 | 亚洲日本一区二区三区在线 | 精品一区二区三区波多野结衣 | 亚洲成av人在线观看网址 | 午夜精品久久久内射近拍高清 | 久久久av男人的天堂 | 55夜色66夜色国产精品视频 | 亚洲人成影院在线无码按摩店 | 成人毛片一区二区 | 激情综合激情五月俺也去 | 免费国产成人高清在线观看网站 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 在线播放亚洲第一字幕 | 色噜噜亚洲男人的天堂 | 波多野结衣乳巨码无在线观看 | 精品国产青草久久久久福利 | 国产午夜亚洲精品不卡下载 | 中文久久乱码一区二区 | 日产国产精品亚洲系列 | 免费国产黄网站在线观看 | 国产精品鲁鲁鲁 | 欧美xxxxx精品 | 好屌草这里只有精品 | 国产亲子乱弄免费视频 | 久久国产自偷自偷免费一区调 | 欧美激情内射喷水高潮 | 国产精品人妻一区二区三区四 | www国产亚洲精品久久网站 | 给我免费的视频在线观看 | 精品国产乱码久久久久乱码 | 亚洲理论电影在线观看 | 两性色午夜视频免费播放 | 人人妻人人澡人人爽精品欧美 | 色综合天天综合狠狠爱 | 欧美人妻一区二区三区 | 色欲av亚洲一区无码少妇 | 久久国产劲爆∧v内射 | 久久精品人人做人人综合试看 | 女高中生第一次破苞av | 女高中生第一次破苞av | 扒开双腿吃奶呻吟做受视频 | 人人澡人人妻人人爽人人蜜桃 | 国产午夜亚洲精品不卡下载 | 激情人妻另类人妻伦 | 中文字幕无码免费久久9一区9 | 在线观看欧美一区二区三区 | 在线播放亚洲第一字幕 | 高潮毛片无遮挡高清免费视频 | 亚洲国产成人av在线观看 | 国产亚洲精品久久久久久国模美 | 国产精品.xx视频.xxtv | 日韩少妇白浆无码系列 | 狠狠色噜噜狠狠狠狠7777米奇 | 亚洲熟妇自偷自拍另类 | 国产精品第一区揄拍无码 | 久久久中文久久久无码 | av人摸人人人澡人人超碰下载 | 亚洲国产成人av在线观看 | 午夜丰满少妇性开放视频 | 国产精品美女久久久网av | 欧美人与牲动交xxxx | 国产97色在线 | 免 | 大屁股大乳丰满人妻 | 亚洲码国产精品高潮在线 | 日本精品少妇一区二区三区 | 亚洲精品国产品国语在线观看 | aa片在线观看视频在线播放 | 成人欧美一区二区三区黑人免费 | 色综合久久网 | 欧美野外疯狂做受xxxx高潮 | 国产在线无码精品电影网 | 久久久久99精品国产片 | 正在播放老肥熟妇露脸 | 国产精品高潮呻吟av久久4虎 | 老子影院午夜精品无码 | 成人试看120秒体验区 | 久久久久亚洲精品男人的天堂 | 青青久在线视频免费观看 | 久久亚洲国产成人精品性色 | av无码电影一区二区三区 | 国产色xx群视频射精 | 人人妻人人澡人人爽人人精品浪潮 | 狠狠色丁香久久婷婷综合五月 | 欧美成人免费全部网站 | 在线看片无码永久免费视频 | 福利一区二区三区视频在线观看 | 欧美人与物videos另类 | 中文毛片无遮挡高清免费 | 国产在线精品一区二区高清不卡 | 国产成人精品一区二区在线小狼 | 97夜夜澡人人爽人人喊中国片 | 成人无码视频在线观看网站 | 日本成熟视频免费视频 | 日本精品少妇一区二区三区 | 久久精品视频在线看15 | 亚洲乱码国产乱码精品精 | 国产av无码专区亚洲a∨毛片 | 精品 日韩 国产 欧美 视频 | 一个人看的视频www在线 | 一本大道久久东京热无码av | 中文字幕+乱码+中文字幕一区 | 久久天天躁狠狠躁夜夜免费观看 | 国产两女互慰高潮视频在线观看 | 亚洲人成网站免费播放 | 国产人妻精品一区二区三区 | 中文字幕乱码人妻二区三区 | 国产特级毛片aaaaaa高潮流水 | 日本成熟视频免费视频 | 国产成人无码一二三区视频 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 中文字幕 亚洲精品 第1页 | 蜜桃无码一区二区三区 | 国产欧美亚洲精品a | 又大又黄又粗又爽的免费视频 | 日日天干夜夜狠狠爱 | 久久国产精品精品国产色婷婷 | 1000部夫妻午夜免费 | 99国产精品白浆在线观看免费 | 国产色精品久久人妻 | 水蜜桃亚洲一二三四在线 | 国产香蕉97碰碰久久人人 | 暴力强奷在线播放无码 | 蜜桃视频插满18在线观看 | 永久免费观看国产裸体美女 | 久久无码中文字幕免费影院蜜桃 | 国产无遮挡吃胸膜奶免费看 | 国产人成高清在线视频99最全资源 | 伊人久久大香线蕉av一区二区 | 在线精品国产一区二区三区 | 免费国产黄网站在线观看 | 人人爽人人爽人人片av亚洲 | 国产精品二区一区二区aⅴ污介绍 | 色五月丁香五月综合五月 | 精品一区二区三区波多野结衣 | 午夜精品一区二区三区的区别 | 美女黄网站人色视频免费国产 | 午夜不卡av免费 一本久久a久久精品vr综合 | 午夜无码人妻av大片色欲 | 伊人色综合久久天天小片 | 综合激情五月综合激情五月激情1 | 国产精品第一区揄拍无码 | 牲欲强的熟妇农村老妇女视频 | 国产真实夫妇视频 | 欧美日韩综合一区二区三区 | 欧洲熟妇精品视频 | 国产精品久久久久久亚洲毛片 | 精品人妻中文字幕有码在线 | 免费乱码人妻系列无码专区 | 国产亚洲tv在线观看 | 麻花豆传媒剧国产免费mv在线 | 天天拍夜夜添久久精品大 | 欧美亚洲日韩国产人成在线播放 | 亚洲の无码国产の无码步美 | 双乳奶水饱满少妇呻吟 | 玩弄人妻少妇500系列视频 | 国产真人无遮挡作爱免费视频 | 九九久久精品国产免费看小说 | 精品无码国产一区二区三区av | 精品国产成人一区二区三区 | 日本www一道久久久免费榴莲 | 精品国产青草久久久久福利 | 亚洲毛片av日韩av无码 | 精品国产福利一区二区 | 久久99精品久久久久久 | 日韩少妇白浆无码系列 | 天堂久久天堂av色综合 | 成 人 网 站国产免费观看 | 色综合天天综合狠狠爱 | 日本一卡2卡3卡四卡精品网站 | 国产成人无码av片在线观看不卡 | 国产97人人超碰caoprom | 久久人人爽人人爽人人片ⅴ | 国产精品久久久久无码av色戒 | 中文毛片无遮挡高清免费 | 亚洲精品成人福利网站 | 欧洲美熟女乱又伦 | 国产人妻精品午夜福利免费 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 女人色极品影院 | 蜜桃视频韩日免费播放 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 精品欧美一区二区三区久久久 | 国产av人人夜夜澡人人爽麻豆 | 欧洲欧美人成视频在线 | 野狼第一精品社区 | 曰韩少妇内射免费播放 | 成人aaa片一区国产精品 | 久久久久久久人妻无码中文字幕爆 | 内射欧美老妇wbb | 久久 国产 尿 小便 嘘嘘 | 久久精品国产一区二区三区肥胖 | 亚洲成在人网站无码天堂 | 久久久久se色偷偷亚洲精品av | 国产欧美精品一区二区三区 | 大地资源网第二页免费观看 | 青青久在线视频免费观看 | 天天av天天av天天透 | 国产极品美女高潮无套在线观看 | 国产舌乚八伦偷品w中 | 美女张开腿让人桶 | 狠狠躁日日躁夜夜躁2020 | 亚洲午夜福利在线观看 | 久久综合给久久狠狠97色 | 欧洲熟妇精品视频 | 久久久国产精品无码免费专区 | 999久久久国产精品消防器材 | 乱码av麻豆丝袜熟女系列 | 蜜桃视频韩日免费播放 | 国产成人综合美国十次 | 久久精品中文字幕一区 | 国产一区二区三区四区五区加勒比 | 国产成人无码av片在线观看不卡 | 日本一区二区更新不卡 | 欧美性黑人极品hd | 国产人妻久久精品二区三区老狼 | 国产欧美熟妇另类久久久 | 精品少妇爆乳无码av无码专区 | 性啪啪chinese东北女人 | 女人被男人爽到呻吟的视频 | 老子影院午夜精品无码 | 四虎国产精品一区二区 | 国产精品久久久久9999小说 | 美女毛片一区二区三区四区 | 国产精品美女久久久 | 欧美精品无码一区二区三区 | 成人精品一区二区三区中文字幕 | 激情内射亚州一区二区三区爱妻 | 欧美黑人性暴力猛交喷水 | 一本久久a久久精品亚洲 | 亚洲精品久久久久中文第一幕 | 免费无码的av片在线观看 | 午夜成人1000部免费视频 | 最新国产乱人伦偷精品免费网站 | 激情国产av做激情国产爱 | 国产无遮挡吃胸膜奶免费看 | 男女下面进入的视频免费午夜 | 丰满人妻精品国产99aⅴ | 黑人巨大精品欧美一区二区 | 欧美xxxx黑人又粗又长 | 亚洲国产精品毛片av不卡在线 | 国产成人久久精品流白浆 | 国产片av国语在线观看 | 四虎国产精品免费久久 | 对白脏话肉麻粗话av | 精品一区二区三区波多野结衣 | 欧美色就是色 | 亚洲大尺度无码无码专区 | 国产av一区二区三区最新精品 | 午夜无码人妻av大片色欲 | 久久精品女人天堂av免费观看 | 51国偷自产一区二区三区 | 精品夜夜澡人妻无码av蜜桃 | 玩弄人妻少妇500系列视频 | 2019nv天堂香蕉在线观看 | 好男人社区资源 | 亚洲欧美日韩成人高清在线一区 | 亚洲国精产品一二二线 | 亚洲中文字幕av在天堂 | 中文无码成人免费视频在线观看 | 国产乱人偷精品人妻a片 | 久久zyz资源站无码中文动漫 | 色综合久久久无码网中文 | 亚洲色www成人永久网址 | 一区二区三区乱码在线 | 欧洲 | 亚洲熟妇自偷自拍另类 | 男人扒开女人内裤强吻桶进去 | 一本大道久久东京热无码av | 欧洲vodafone精品性 | 亚洲国产精品美女久久久久 | 黑人大群体交免费视频 | 欧美 亚洲 国产 另类 | 亚洲 激情 小说 另类 欧美 | 国产电影无码午夜在线播放 | 久久国产精品精品国产色婷婷 | 99久久无码一区人妻 | 欧美乱妇无乱码大黄a片 | 欧美日韩人成综合在线播放 | 草草网站影院白丝内射 | 国产区女主播在线观看 | 午夜精品久久久久久久久 | 一本一道久久综合久久 | 国产超碰人人爽人人做人人添 | 国产性生交xxxxx无码 | 亚洲热妇无码av在线播放 | 精品人人妻人人澡人人爽人人 | 黄网在线观看免费网站 | 亚洲经典千人经典日产 | 成人精品视频一区二区三区尤物 | 欧美精品无码一区二区三区 | 亚洲狠狠婷婷综合久久 | 免费无码一区二区三区蜜桃大 | 青春草在线视频免费观看 | 亚洲狠狠色丁香婷婷综合 | 桃花色综合影院 | 午夜精品一区二区三区的区别 | 熟妇女人妻丰满少妇中文字幕 | 亚洲s色大片在线观看 | 国产精品亚洲一区二区三区喷水 | 国产亚洲精品久久久久久大师 | 亚洲 高清 成人 动漫 | 99视频精品全部免费免费观看 | 亚洲 欧美 激情 小说 另类 | 色婷婷综合激情综在线播放 | 97夜夜澡人人双人人人喊 | 亚洲中文字幕av在天堂 | 国产成人午夜福利在线播放 | 亚洲欧美日韩综合久久久 | 亚洲精品久久久久avwww潮水 | 无码一区二区三区在线观看 | 又大又硬又爽免费视频 | 国产真实乱对白精彩久久 | 久久精品成人欧美大片 | 亚洲理论电影在线观看 | 国产农村乱对白刺激视频 | 亚洲理论电影在线观看 | 伊人久久大香线蕉亚洲 | 亚洲另类伦春色综合小说 | 又粗又大又硬毛片免费看 | 欧美熟妇另类久久久久久多毛 | 少妇的肉体aa片免费 | 无套内谢老熟女 | 粗大的内捧猛烈进出视频 | 强辱丰满人妻hd中文字幕 | 思思久久99热只有频精品66 | 国产在线精品一区二区三区直播 | 欧洲精品码一区二区三区免费看 | 国产高清不卡无码视频 | 老熟妇仑乱视频一区二区 | 国产精品二区一区二区aⅴ污介绍 | 欧美人与动性行为视频 | 亚洲国产精品成人久久蜜臀 | 小sao货水好多真紧h无码视频 | 国产国语老龄妇女a片 | 欧美色就是色 | 国产亚洲精品久久久闺蜜 | 日韩精品无码一本二本三本色 | 国产精品无码mv在线观看 | 色婷婷欧美在线播放内射 | 亚洲精品久久久久久一区二区 | 国产va免费精品观看 | 精品一区二区不卡无码av | 久久久成人毛片无码 | 荫蒂被男人添的好舒服爽免费视频 | 狠狠噜狠狠狠狠丁香五月 | 99精品国产综合久久久久五月天 | 久久99精品国产麻豆蜜芽 | 人妻天天爽夜夜爽一区二区 | 麻豆成人精品国产免费 | v一区无码内射国产 | 欧美人与禽猛交狂配 | 1000部啪啪未满十八勿入下载 | 亚洲成av人综合在线观看 | 又大又硬又爽免费视频 | 中文字幕无码av激情不卡 | 最近中文2019字幕第二页 | 激情内射日本一区二区三区 | 日韩欧美群交p片內射中文 | 亚洲无人区午夜福利码高清完整版 | 在教室伦流澡到高潮hnp视频 | 欧美人与牲动交xxxx | 俄罗斯老熟妇色xxxx | 成人无码视频免费播放 | 亚洲国产成人av在线观看 | 国产精品理论片在线观看 | 精品 日韩 国产 欧美 视频 | 永久免费观看国产裸体美女 | 成熟女人特级毛片www免费 | 日韩在线不卡免费视频一区 | 未满小14洗澡无码视频网站 | 成在人线av无码免费 | 亚洲色成人中文字幕网站 | 国产熟妇高潮叫床视频播放 | 无码成人精品区在线观看 | 久久五月精品中文字幕 | 十八禁真人啪啪免费网站 | 色 综合 欧美 亚洲 国产 | 亚洲 高清 成人 动漫 | 55夜色66夜色国产精品视频 | 亚洲精品一区国产 | 亚洲人成影院在线无码按摩店 | 无码吃奶揉捏奶头高潮视频 | 国产欧美熟妇另类久久久 | 久久国产精品偷任你爽任你 | 日韩av无码一区二区三区 | 色综合久久久无码中文字幕 | 少妇高潮喷潮久久久影院 | 色一情一乱一伦一区二区三欧美 | 动漫av一区二区在线观看 | 99精品国产综合久久久久五月天 | 欧美真人作爱免费视频 | 亚洲一区二区三区香蕉 | 成 人 网 站国产免费观看 | 精品国产成人一区二区三区 | 亚洲第一网站男人都懂 | 欧美 日韩 亚洲 在线 | 亚洲中文字幕在线无码一区二区 | 久久国产劲爆∧v内射 | 国产精品久久久久影院嫩草 | 天天做天天爱天天爽综合网 | 少妇无套内谢久久久久 | 国产乱码精品一品二品 | 亚洲精品一区二区三区大桥未久 | 亚洲中文字幕久久无码 | 国产午夜福利100集发布 | 久久亚洲日韩精品一区二区三区 | 2019nv天堂香蕉在线观看 | 国产香蕉97碰碰久久人人 | 国产精品国产三级国产专播 | 亚洲日韩av一区二区三区中文 | 欧美肥老太牲交大战 | 亚洲精品久久久久久一区二区 | 99久久精品午夜一区二区 | 国产亲子乱弄免费视频 | 欧美日本免费一区二区三区 | 国产亚洲精品精品国产亚洲综合 | 精品日本一区二区三区在线观看 | 一个人免费观看的www视频 | 国产精品无码成人午夜电影 | 一本色道婷婷久久欧美 | 欧美精品在线观看 | 国内老熟妇对白xxxxhd | 久久国语露脸国产精品电影 | 精品国产一区av天美传媒 | 国内精品人妻无码久久久影院 | 精品国产国产综合精品 | 全黄性性激高免费视频 | 少妇人妻大乳在线视频 | 综合网日日天干夜夜久久 | 国产在线精品一区二区三区直播 | 欧美日韩一区二区免费视频 | 成人欧美一区二区三区黑人 | 亚洲区小说区激情区图片区 | 国产精品人人妻人人爽 | 大色综合色综合网站 | 黑人巨大精品欧美黑寡妇 | 久青草影院在线观看国产 | 亚洲精品综合五月久久小说 | 国产亚洲精品久久久闺蜜 | 国语自产偷拍精品视频偷 | 性欧美疯狂xxxxbbbb | 免费国产黄网站在线观看 | 少妇性俱乐部纵欲狂欢电影 | 国产欧美精品一区二区三区 | 强开小婷嫩苞又嫩又紧视频 | 国产亚洲精品久久久久久国模美 | 人妻体内射精一区二区三四 | 亚洲人亚洲人成电影网站色 | 久久午夜无码鲁丝片 | 成人三级无码视频在线观看 | 在线观看免费人成视频 | 亚洲热妇无码av在线播放 | 性色欲网站人妻丰满中文久久不卡 | 欧美日韩在线亚洲综合国产人 | 永久免费观看美女裸体的网站 | 国产av一区二区精品久久凹凸 | 在线视频网站www色 | 久久99久久99精品中文字幕 | 色综合久久中文娱乐网 | 国产亚洲欧美日韩亚洲中文色 | 在线a亚洲视频播放在线观看 | 日韩人妻少妇一区二区三区 | 国产午夜福利亚洲第一 | 黑人粗大猛烈进出高潮视频 | 黑人巨大精品欧美黑寡妇 | 纯爱无遮挡h肉动漫在线播放 | 国产69精品久久久久app下载 | 中文字幕乱码亚洲无线三区 | 精品国产一区二区三区四区 | 内射后入在线观看一区 | 成人综合网亚洲伊人 | 国产精品久久福利网站 | 鲁大师影院在线观看 | 国产精品久久久午夜夜伦鲁鲁 | 红桃av一区二区三区在线无码av | 奇米影视7777久久精品人人爽 | 老熟妇乱子伦牲交视频 | 国产一区二区三区四区五区加勒比 | 色婷婷av一区二区三区之红樱桃 | 亚洲色无码一区二区三区 | 大地资源网第二页免费观看 | 好爽又高潮了毛片免费下载 | 久久无码中文字幕免费影院蜜桃 | 亚洲成色在线综合网站 | 国产内射老熟女aaaa | 国产热a欧美热a在线视频 | 色窝窝无码一区二区三区色欲 | 性生交片免费无码看人 | 色噜噜亚洲男人的天堂 | 波多野结衣乳巨码无在线观看 | 成 人影片 免费观看 | 免费观看激色视频网站 | 久久综合给久久狠狠97色 | 日韩精品乱码av一区二区 | 日本又色又爽又黄的a片18禁 | 国产无遮挡又黄又爽又色 | 天天躁日日躁狠狠躁免费麻豆 | 一本色道婷婷久久欧美 | 爱做久久久久久 | 亚洲 高清 成人 动漫 | 国产农村乱对白刺激视频 | 国产国语老龄妇女a片 | 又大又黄又粗又爽的免费视频 | 国产精品久久久午夜夜伦鲁鲁 | 又色又爽又黄的美女裸体网站 | 日本成熟视频免费视频 | 麻豆国产丝袜白领秘书在线观看 | 国产精品美女久久久网av | 亚洲国产成人av在线观看 | 欧美 丝袜 自拍 制服 另类 | 东京热无码av男人的天堂 | 精品人人妻人人澡人人爽人人 | 国产在热线精品视频 | 夜精品a片一区二区三区无码白浆 | 无码毛片视频一区二区本码 | 青春草在线视频免费观看 | 亚洲色在线无码国产精品不卡 | 国产精品国产自线拍免费软件 | 久久99精品久久久久久动态图 | 精品成在人线av无码免费看 | 亚洲 日韩 欧美 成人 在线观看 | 精品欧美一区二区三区久久久 | 日本丰满熟妇videos | 亚洲熟熟妇xxxx | 双乳奶水饱满少妇呻吟 | 国产精品内射视频免费 | 精品人妻人人做人人爽夜夜爽 | 51国偷自产一区二区三区 | 中文字幕日产无线码一区 | 国产精品.xx视频.xxtv | 动漫av一区二区在线观看 | 国精产品一区二区三区 | 国产精品美女久久久 | 亚洲精品一区三区三区在线观看 | 欧美第一黄网免费网站 | 激情爆乳一区二区三区 | 少妇无码一区二区二三区 | 成人性做爰aaa片免费看 | 帮老师解开蕾丝奶罩吸乳网站 | 国内揄拍国内精品人妻 | 天天躁夜夜躁狠狠是什么心态 | 高清国产亚洲精品自在久久 | 中文字幕 人妻熟女 | 最新国产乱人伦偷精品免费网站 | 欧美真人作爱免费视频 | 对白脏话肉麻粗话av | 麻豆果冻传媒2021精品传媒一区下载 | 色综合久久久久综合一本到桃花网 | 亚洲一区二区三区在线观看网站 | 国产精品久久国产三级国 | 国产成人精品一区二区在线小狼 | 东京热男人av天堂 | 噜噜噜亚洲色成人网站 | 草草网站影院白丝内射 | 99久久精品无码一区二区毛片 | 亚洲爆乳精品无码一区二区三区 | 国产精品久久精品三级 | 精品久久久久久亚洲精品 | 久久综合色之久久综合 | 小鲜肉自慰网站xnxx | 欧洲vodafone精品性 | 少妇人妻av毛片在线看 | 精品国产乱码久久久久乱码 | 亚洲成色在线综合网站 | 天堂а√在线地址中文在线 | 熟妇人妻激情偷爽文 | 夜精品a片一区二区三区无码白浆 | 国产偷抇久久精品a片69 | 黑人粗大猛烈进出高潮视频 | 国产免费久久久久久无码 | 久久99精品国产麻豆蜜芽 | 99久久精品国产一区二区蜜芽 | 日韩欧美中文字幕公布 | 国产精品亚洲一区二区三区喷水 | 人人妻人人澡人人爽人人精品浪潮 | 国产性生大片免费观看性 | 亚洲精品午夜国产va久久成人 | 国色天香社区在线视频 | 久久久中文字幕日本无吗 | 欧美色就是色 | 福利一区二区三区视频在线观看 | 日本高清一区免费中文视频 | 亚拍精品一区二区三区探花 | 久久99精品国产.久久久久 | 成 人 免费观看网站 | 波多野结衣aⅴ在线 | 国产亚洲欧美日韩亚洲中文色 | 男女爱爱好爽视频免费看 | 国产人妻久久精品二区三区老狼 | 精品国产福利一区二区 | 成 人 网 站国产免费观看 | 欧美35页视频在线观看 | 国产成人无码午夜视频在线观看 | 亚洲乱码中文字幕在线 | a国产一区二区免费入口 | 久久综合九色综合欧美狠狠 | 午夜精品久久久久久久 | 自拍偷自拍亚洲精品10p | 又色又爽又黄的美女裸体网站 | 国产精品无套呻吟在线 | 亚洲日韩乱码中文无码蜜桃臀网站 | 国产亚av手机在线观看 | 午夜丰满少妇性开放视频 | 国产精品久久久久久久9999 | 色爱情人网站 | 欧美性色19p | 未满小14洗澡无码视频网站 | 婷婷六月久久综合丁香 | 久久久亚洲欧洲日产国码αv | 欧美日本免费一区二区三区 | 玩弄中年熟妇正在播放 | 欧洲熟妇精品视频 | 久久国产劲爆∧v内射 | 国产亚av手机在线观看 | 在线欧美精品一区二区三区 | 九九久久精品国产免费看小说 | 国产精华av午夜在线观看 | 国产疯狂伦交大片 | 无码国产乱人伦偷精品视频 | 亚洲人成网站在线播放942 | 亚洲人亚洲人成电影网站色 | 国产午夜亚洲精品不卡 | 中文字幕av伊人av无码av | 无码精品人妻一区二区三区av | 亚洲欧美日韩综合久久久 | 亚洲一区二区三区国产精华液 | 领导边摸边吃奶边做爽在线观看 | 香港三级日本三级妇三级 | 性做久久久久久久免费看 | 久久精品国产大片免费观看 | 欧美日韩一区二区三区自拍 | 丰满护士巨好爽好大乳 | 亚洲成av人片在线观看无码不卡 | 国产精品成人av在线观看 | 一区二区三区乱码在线 | 欧洲 | 成人性做爰aaa片免费看不忠 | 日本熟妇大屁股人妻 | 99久久人妻精品免费二区 | 中文精品无码中文字幕无码专区 | 久激情内射婷内射蜜桃人妖 | 九九综合va免费看 | 精品国产一区二区三区四区在线看 | 嫩b人妻精品一区二区三区 | 国产综合久久久久鬼色 | 老司机亚洲精品影院无码 | 亚洲色欲色欲天天天www | 亚洲 激情 小说 另类 欧美 | 欧美丰满老熟妇xxxxx性 | 亚洲精品一区二区三区在线观看 | 免费国产成人高清在线观看网站 | 国产无遮挡又黄又爽又色 | 国产精品人人妻人人爽 | 丰满少妇女裸体bbw | 荫蒂添的好舒服视频囗交 | 色婷婷欧美在线播放内射 | 久久综合激激的五月天 | 欧美第一黄网免费网站 | 国产无套粉嫩白浆在线 | 娇妻被黑人粗大高潮白浆 | 国产成人精品久久亚洲高清不卡 | 午夜理论片yy44880影院 | 婷婷综合久久中文字幕蜜桃三电影 | 成人综合网亚洲伊人 | 任你躁国产自任一区二区三区 | 男女作爱免费网站 | 正在播放老肥熟妇露脸 | 久久亚洲国产成人精品性色 | 粗大的内捧猛烈进出视频 | 久久久久久久女国产乱让韩 | 亲嘴扒胸摸屁股激烈网站 | 亚洲日本在线电影 | 免费男性肉肉影院 | 九九热爱视频精品 | 老熟女重囗味hdxx69 | 天天拍夜夜添久久精品大 | 亚洲日本在线电影 | 国产成人无码专区 | 人人澡人人妻人人爽人人蜜桃 | 国产精品久久久久影院嫩草 | 丰满人妻一区二区三区免费视频 | 亚洲一区二区三区播放 | 久久综合给合久久狠狠狠97色 | 午夜精品一区二区三区的区别 | 国色天香社区在线视频 | 精品国产青草久久久久福利 | 天天躁日日躁狠狠躁免费麻豆 | 久久熟妇人妻午夜寂寞影院 | 久久久中文久久久无码 | 日本va欧美va欧美va精品 | 亚洲欧美综合区丁香五月小说 | 97se亚洲精品一区 | 狠狠色丁香久久婷婷综合五月 | 成人亚洲精品久久久久软件 | 亚洲 日韩 欧美 成人 在线观看 | 久久精品国产日本波多野结衣 | 国语精品一区二区三区 | 国产精品怡红院永久免费 | 日韩精品a片一区二区三区妖精 | 免费无码av一区二区 | 国产精品鲁鲁鲁 | 欧美xxxx黑人又粗又长 | 老司机亚洲精品影院无码 | 丁香花在线影院观看在线播放 | 免费无码一区二区三区蜜桃大 | 国产绳艺sm调教室论坛 | 亚洲一区av无码专区在线观看 | 精品人妻人人做人人爽 | 久久午夜无码鲁丝片午夜精品 | 乱码午夜-极国产极内射 | 草草网站影院白丝内射 | 久久97精品久久久久久久不卡 | 亚洲中文字幕在线观看 | 亚洲无人区一区二区三区 | 麻豆国产人妻欲求不满谁演的 | 波多野结衣乳巨码无在线观看 | 免费乱码人妻系列无码专区 | 疯狂三人交性欧美 | 夫妻免费无码v看片 | 丰满少妇女裸体bbw | 国产成人精品久久亚洲高清不卡 | 国产精品久久久久7777 | 日韩欧美中文字幕公布 | 亚洲一区二区三区偷拍女厕 | 天天做天天爱天天爽综合网 | 牲欲强的熟妇农村老妇女 | 好爽又高潮了毛片免费下载 | 无码人妻丰满熟妇区五十路百度 | 免费人成在线视频无码 | 亚洲の无码国产の无码步美 | 久久国产精品精品国产色婷婷 | yw尤物av无码国产在线观看 | 国产极品美女高潮无套在线观看 | 成人精品一区二区三区中文字幕 | 日本免费一区二区三区最新 | 97人妻精品一区二区三区 | 亚洲国产精品无码久久久久高潮 | 男女下面进入的视频免费午夜 | 性欧美牲交在线视频 | 成人免费视频在线观看 | 呦交小u女精品视频 | 色婷婷av一区二区三区之红樱桃 | 特黄特色大片免费播放器图片 | 国产免费无码一区二区视频 | 大肉大捧一进一出视频出来呀 | 日本乱人伦片中文三区 | 成人性做爰aaa片免费看 | 激情爆乳一区二区三区 | 久久国产精品二国产精品 | 亚洲国产欧美在线成人 | 亚洲欧美日韩国产精品一区二区 | 国产精品美女久久久久av爽李琼 | 樱花草在线播放免费中文 | 国产成人综合色在线观看网站 | 久久人人爽人人人人片 | 亚洲一区二区三区四区 | 荡女精品导航 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 影音先锋中文字幕无码 | 亚洲天堂2017无码中文 | 丰满少妇熟乱xxxxx视频 | 麻豆精品国产精华精华液好用吗 | 免费中文字幕日韩欧美 | 国产精品人人爽人人做我的可爱 | 国产精品无码永久免费888 | 国产亚洲精品久久久久久久 | 日韩精品乱码av一区二区 | 日日躁夜夜躁狠狠躁 | 日日摸夜夜摸狠狠摸婷婷 | 少妇无码一区二区二三区 | 99国产精品白浆在线观看免费 | 人妻有码中文字幕在线 | 色综合视频一区二区三区 | 中文字幕日产无线码一区 | 亚洲欧美中文字幕5发布 | 少女韩国电视剧在线观看完整 | 国产99久久精品一区二区 | 性色av无码免费一区二区三区 | 日产精品99久久久久久 | 水蜜桃av无码 | 日本一区二区三区免费高清 | 国产在线精品一区二区三区直播 | 日本在线高清不卡免费播放 | 国产精品无码一区二区三区不卡 | 女人被男人爽到呻吟的视频 | 成 人影片 免费观看 | www国产亚洲精品久久久日本 | 女高中生第一次破苞av | 97无码免费人妻超级碰碰夜夜 | 亚洲热妇无码av在线播放 | 极品嫩模高潮叫床 | 色一情一乱一伦一区二区三欧美 | 性生交片免费无码看人 | 久久这里只有精品视频9 | 成人免费无码大片a毛片 | 久久久久久久女国产乱让韩 | 国产成人人人97超碰超爽8 | 少妇久久久久久人妻无码 | 国产xxx69麻豆国语对白 | 久久久久久国产精品无码下载 | 亚洲精品无码国产 | 女人色极品影院 | 欧美色就是色 | 久久综合激激的五月天 | 中文字幕色婷婷在线视频 | 荡女精品导航 | 熟女少妇在线视频播放 | 天堂亚洲免费视频 | 久久五月精品中文字幕 | 天干天干啦夜天干天2017 | 色诱久久久久综合网ywww | 亚洲欧美中文字幕5发布 | 女人被男人爽到呻吟的视频 | 国产一区二区不卡老阿姨 | 亚洲日韩中文字幕在线播放 | 国产精品毛片一区二区 | 麻豆人妻少妇精品无码专区 | 精品无码一区二区三区爱欲 | 亚洲人成人无码网www国产 | 中文字幕av伊人av无码av | 中文字幕久久久久人妻 | 激情国产av做激情国产爱 | 成年女人永久免费看片 | 国产精品免费大片 | 99久久久无码国产aaa精品 | 久久久无码中文字幕久... | 中文精品久久久久人妻不卡 | 中文字幕av日韩精品一区二区 | 国产特级毛片aaaaaaa高清 | 国产成人精品无码播放 | 午夜理论片yy44880影院 | 人妻体内射精一区二区三四 | 又粗又大又硬毛片免费看 | 精品一区二区三区无码免费视频 | 欧美 日韩 亚洲 在线 | 桃花色综合影院 | 中文字幕日韩精品一区二区三区 | 国产三级精品三级男人的天堂 | 欧洲精品码一区二区三区免费看 | 日韩av激情在线观看 | 国产午夜亚洲精品不卡 | 亚洲日韩一区二区 | 精品午夜福利在线观看 | 精品人人妻人人澡人人爽人人 | 亚洲色无码一区二区三区 | 荫蒂被男人添的好舒服爽免费视频 | 人妻无码αv中文字幕久久琪琪布 | 捆绑白丝粉色jk震动捧喷白浆 | 亚洲高清偷拍一区二区三区 | 永久免费观看美女裸体的网站 | 国产偷自视频区视频 | 性做久久久久久久久 | 国产av久久久久精东av | 波多野结衣一区二区三区av免费 | 全球成人中文在线 | 国内揄拍国内精品人妻 | 成人无码视频在线观看网站 | 中文字幕乱妇无码av在线 | 人人超人人超碰超国产 | 中文字幕无码视频专区 | 内射爽无广熟女亚洲 | 亚洲毛片av日韩av无码 | 久久人人爽人人爽人人片av高清 | 樱花草在线社区www | 人人爽人人爽人人片av亚洲 | 国产亚洲精品久久久久久久 | 国产成人无码av一区二区 | 欧美国产日韩亚洲中文 | 特级做a爰片毛片免费69 | 久久99精品久久久久久动态图 | 色偷偷人人澡人人爽人人模 | 久久久久国色av免费观看性色 | 久久综合网欧美色妞网 | 国产亚洲视频中文字幕97精品 | 日韩无套无码精品 | 欧美性猛交内射兽交老熟妇 | 婷婷色婷婷开心五月四房播播 | 午夜福利不卡在线视频 | 精品国产精品久久一区免费式 | 国产无套内射久久久国产 | 亚无码乱人伦一区二区 | 久久久中文久久久无码 | 97久久国产亚洲精品超碰热 | 天天做天天爱天天爽综合网 | 波多野结衣乳巨码无在线观看 | 国产美女极度色诱视频www | 东京无码熟妇人妻av在线网址 | 啦啦啦www在线观看免费视频 | 无码一区二区三区在线 | 国产在线无码精品电影网 | 少妇邻居内射在线 | 狂野欧美性猛交免费视频 | 色婷婷欧美在线播放内射 | 国产成人综合色在线观看网站 | 嫩b人妻精品一区二区三区 | 俺去俺来也在线www色官网 | 国产电影无码午夜在线播放 | 少妇被黑人到高潮喷出白浆 | 99久久精品日本一区二区免费 | 人人妻人人澡人人爽欧美一区九九 | 久久亚洲中文字幕精品一区 | 暴力强奷在线播放无码 | 久久亚洲中文字幕无码 | 成人免费视频一区二区 | 国产一区二区三区日韩精品 | 蜜臀av在线播放 久久综合激激的五月天 | 沈阳熟女露脸对白视频 | 成人性做爰aaa片免费看不忠 | 中文字幕无码av激情不卡 | 亚洲精品综合五月久久小说 | av小次郎收藏 | 老司机亚洲精品影院无码 | 国内精品九九久久久精品 | 国产av无码专区亚洲a∨毛片 | 在线天堂新版最新版在线8 | 久久久国产精品无码免费专区 | 高清无码午夜福利视频 | 扒开双腿疯狂进出爽爽爽视频 | 国产绳艺sm调教室论坛 | 亚洲国产精品毛片av不卡在线 | 欧美35页视频在线观看 | 亚洲爆乳大丰满无码专区 | 免费人成在线视频无码 | 一二三四在线观看免费视频 | 日韩av无码一区二区三区不卡 | 97人妻精品一区二区三区 | 人人妻人人澡人人爽欧美一区 | 久久伊人色av天堂九九小黄鸭 | 伦伦影院午夜理论片 | 精品久久久久久人妻无码中文字幕 | 国产电影无码午夜在线播放 | 成 人 网 站国产免费观看 | 亚洲综合久久一区二区 | 天堂亚洲2017在线观看 | 男女猛烈xx00免费视频试看 | 动漫av网站免费观看 | 高潮毛片无遮挡高清免费 | 十八禁真人啪啪免费网站 | 精品久久久久久人妻无码中文字幕 | 无码一区二区三区在线 | 狠狠综合久久久久综合网 | 99在线 | 亚洲 | 国产精品理论片在线观看 | 永久免费观看国产裸体美女 | 久久久无码中文字幕久... | 天堂亚洲2017在线观看 | 波多野结衣一区二区三区av免费 | 国内精品人妻无码久久久影院蜜桃 | 亚洲の无码国产の无码步美 | 久久久久久av无码免费看大片 | 欧美丰满熟妇xxxx | 亚洲精品一区二区三区在线观看 | 内射老妇bbwx0c0ck | 天天做天天爱天天爽综合网 | 亚洲国产精品久久久天堂 | 欧美人与动性行为视频 | 国产精品视频免费播放 | 国产精品久久精品三级 | 国产色xx群视频射精 | 日本护士毛茸茸高潮 | 成人亚洲精品久久久久 | av无码久久久久不卡免费网站 | 人妻有码中文字幕在线 | 久久精品人妻少妇一区二区三区 | 中文字幕中文有码在线 | 亚洲七七久久桃花影院 | 小鲜肉自慰网站xnxx | 精品国产一区二区三区av 性色 | 一本色道久久综合狠狠躁 | 亚洲精品国产精品乱码视色 | 久久精品中文字幕大胸 | 久久久久亚洲精品中文字幕 | 成熟妇人a片免费看网站 | 久久精品国产大片免费观看 | 国产性生大片免费观看性 | 樱花草在线社区www | 爽爽影院免费观看 |