精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何避免Kotlin里的陷阱?

開發(fā) 后端
最近 Kotlin 特別流行,并且我也贊同 Kotlin 是一個經(jīng)過深思熟慮后被設(shè)計出的語言,除了下面提到的缺點之外。我會在本文向你分析一些我在開發(fā)過程中遇到的陷阱,并且教你如何避免他們。

最近 Kotlin 特別流行,并且我也贊同 Kotlin 是一個經(jīng)過深思熟慮后被設(shè)計出的語言,除了下面提到的缺點之外。我會在本文向你分析一些我在開發(fā)過程中遇到的陷阱,并且教你如何避免他們。

[[207040]]

謎一樣的 null

在 Kotlin 當(dāng)中,你可以不用考慮在你的代碼中如何處理 null 的問題,這會讓你忘記 null 是無處不在的這個說法,只不過被隱藏了起來。看看下面這個表面看起來沒有問題的類: 

  1. class Foo { 
  2.     private val c: String 
  3.     init { 
  4.         bar() 
  5.         c = "" 
  6.     } 
  7.     private fun bar() { 
  8.         println(c.length) 
  9.     } 

如果你嘗試初始化這個類,那么代碼就會拋出一個 NullPointerException。因為 bar 方法嘗試在 c 變量初始化之前就訪問它。

盡管這個代碼本身就是有問題的,才導(dǎo)致異常拋出。但是更糟糕的是你的編譯器不會發(fā)現(xiàn)這一點。

Kotlin 可以幫你在絕大部分情況下避免 null,但是你不能因此而忘記 null 的存在。否則遲早有一天你會碰上類似的問題。

來自 JDK 的 null

Kotlin 的標(biāo)準(zhǔn)庫能夠很好地處理 null。但是如果你使用了 JDK 中的類,你需要自己處理關(guān)于 JDK 方法調(diào)用可能產(chǎn)生的空指針。

大部分情況下 Kotlin 的標(biāo)準(zhǔn)庫就足夠了,但是有時你需要使用到 ConcurrentHashMap: 

  1. val map = ConcurrentHashMap<String, String>() 
  2. map["foo"] = "bar" 
  3. val bar: String = map["foo"]!! 

這時,你需要使用 !! 操作符。但某些情況下你還可以使用像 (?) 這樣的對 null 安全的操作符來替換它。盡管如此,當(dāng)你使用 !! 或者 ? ,或者編寫了一個適配器來使用 Java 類庫的時候,你會發(fā)現(xiàn)代碼因為這些修改而變的混亂。這是你無法避免的問題。

你還可能會碰上更多更可怕的問題。當(dāng)你使用 JDK 類中的方法的時候,返回值可能是null,而且沒有什么像 Map 訪問一樣的語法糖。

考慮如下例子: 

  1. val queue: Queue<String> = LinkedList() 
  2. queue.peek().toInt() 

這種情況下,你使用了可能返回 null 值的 peek 方法。但是 Kotlin 編譯器不會提示你這個問題,所以當(dāng)你的 Queue 是空隊列的的時候,可能會觸發(fā) NullPointerException 異常。

問題在于我們使用的 Queue 是 JDK 的一個接口,并且當(dāng)你查看 peek 方法的文檔時: 

  1. /** 
  2.   * Retrieves, but does not remove, the head of this queue, 
  3.   * or returns {@code null} if this queue is empty. 
  4.   * 
  5.   * @return the head of this queue, or {@code null} if this queue is empty 
  6.   */ 
  7.   E peek(); 

文檔中說 peek 方法會返回一個 E 類型的對象,但是 Kotlin 認(rèn)為 E 是不可空的。在接下來的 Kotlin 版本中可能會解決這個問題,但是現(xiàn)在當(dāng)你在你的工程中使用類似接口的時候,一定要注意: 

  1. val queue: Queue<String?> = LinkedList() 
  2. queue.peek()?.toInt() 

內(nèi)部 it

當(dāng)一個 lambda 表達(dá)式只有一個參數(shù)的時候,你可以在你的代碼中將其省略,并用 it 代替。

  • it:單參數(shù)的內(nèi)部名稱。當(dāng)你表達(dá)式只有一個參數(shù)的時候,這是一個很有用的特性,聲明的過程可以省略(就像 ->),并且參數(shù)名稱為 it。

問題是,當(dāng)你的代碼中存在向下面例子一樣的嵌套函數(shù)的時候: 

  1. val list = listOf("foo.bar""baz.qux"
  2. list.forEach { 
  3.     it.split(".").forEach { 
  4.         println(it) 
  5.     } 

it 參數(shù)會混淆。解決方法就是像下面這樣顯示的聲明: 

  1. list.forEach { item -> 
  2.     item.split(".").forEach { part -> 
  3.         println(part) 
  4.     } 

看起來是不是好多了!

隱藏的復(fù)制

注意觀察下面的類:

  1. data class Foo(val bars: MutableList) 

data 類提供了一系列的方法,并且你可以通過拷貝得到其鏡像。猜猜下面的代碼會輸出什么? 

  1. val bars = mutableListOf("foobar""wombar"
  2. val foo0 = Foo(bars) 
  3. val foo1 = foo0.copy() 
  4. bars.add("oops"
  5. println(foo1.bars.joinToString()) 

 控制臺會輸出 foobar, wombar, oops。問題出在 copy 方法并沒有真正地復(fù)制一個完整的對象, 而是復(fù)制了對象的引用。當(dāng)你忘記編寫單元測試類,并且將你的 data 類按照不可變類來傳遞的時候,就可能出現(xiàn)這種問題。

解決方法就是當(dāng)你使用 data 類的時候一定要多加小心,并且當(dāng)你必須將其作為值對象的時候,像下面這樣:

  1. data class Foo(val bars: List) 
  • data 類還有一個問題:其 equals / hashCode 方法所用到的屬性不可變。你只能通過手工重寫這些方法的方式來修改返回值。謹(jǐn)記上面這一點。

內(nèi)部方法暴露

仔細(xì)思考下面的例子: 

  1. class MyApi { 
  2.     fun operation0() { 
  3.     } 
  4.     internal fun hiddenOperation() {             
  5.     } 

當(dāng)你在 Kotlin 的項目中引用這個類的時候,internal 關(guān)鍵字是生效的。但是當(dāng)你從一個 Java 項目中使用的時候,hiddenOperation 就變成了一個公共方法!為了避免這種情況,我建議使用接口的方式來隱藏實現(xiàn)的細(xì)節(jié): 

  1. interface MyApi { 
  2.     fun operation0() 
  3. class MyApiImpl: MyApi { 
  4.     override fun operation0() { 
  5.     } 
  6.     internal fun hiddenOperation() { 
  7.     } 

特殊的全局?jǐn)U展

毫無疑問,擴(kuò)展函數(shù)的功能非常重要。但通常,能力越大責(zé)任越大。例如,你可以編寫全局的 JDK 類擴(kuò)展函數(shù)。但是當(dāng)這個函數(shù)只在本地上下文中有意義,卻是全局可見的時候,就會帶來很多麻煩。 

  1. fun String.extractCustomerName() : String { 
  2.     // ... 

每個跳轉(zhuǎn)到你的方法的人都會不知所措。所以我認(rèn)為在你編寫這樣的方法之前務(wù)必三思。下面就是一個建議: 

  1. /** 
  2.  * Returns an element of this [List] wrapped in an Optional 
  3.  * which is empty if `idx` is out of bounds. 
  4.  */ 
  5. fun <T> List<T>.getIfPresent(idx: Int) = 
  6.         if (idx >= size) { 
  7.             Optional.empty() 
  8.         } else { 
  9.             Optional.of(get(idx)) 
  10.         } 
  11. /** 
  12.  * Negates `isPresent`. 
  13.  */ 
  14. fun <T> Optional<T>.isNotPresent() = isPresent.not() 

lambdas Unit 返回值 vs Java SAM 轉(zhuǎn)換

如果你的函數(shù)參數(shù)是 lambdas 表達(dá)式,并且返回值類型是 Unit 的時候,你可以省略return 關(guān)鍵字: 

  1. fun consumeText(text: String, fn: (String) -> Unit) { 
  2. // usage 
  3. consumeText("foo") { 
  4.     println(it) 

這是一個很有趣的特性,但是當(dāng)你在 Java 代碼中調(diào)用該方法的時候會比較尷尬: 

  1. consumeText("foo", (text) -> { 
  2.     System.out.println(text); 
  3.     return Unit.INSTANCE; 
  4. }); 

這對于 Java 端來說是不友好的,如果你想在 Java 中成功調(diào)用該方法,你需要定義如下接口: 

  1. nterface StringConsumer { 
  2.     fun consume(text: String) 
  3. fun consumeText(text: String, fn: StringConsumer) { 

然后你就能使用 Java 的 SAM 轉(zhuǎn)換。

  1. consumeText("foo", System.out::println); 

但是在 Kotlin 這邊看起來就很糟糕了: 

  1. consumeText("foo", object: StringConsumer { 
  2.     override fun consume(text: String) { 
  3.         println(text) 
  4.     } 
  5. }) 

問題關(guān)鍵點在于只有 Java 支持 SAM 轉(zhuǎn)換,Kotlin 并不支持。我的建議是簡單的場景中,只是用 Java 的 SAM 接口作為一個消費者: 

  1. fun consumeText(text: String, fn: Consumer<String>) { 
  2. // usage from Kotlin 
  3. consumeText("foo", Consumer { 
  4.     println(it) 
  5. }) 
  6. // usage from Java 
  7. consumeText("foo", System.out::println); 

Java 中使用不可變集合

Kotlin 提供了 JDK 集合類的不可變版本。 

  1. fun createSet(): Set<String> = setOf("foo"
  2. // ... 
  3. createSet().add("bar") // oops, compile error 

這是一個很好的補(bǔ)充。但是當(dāng)你在看 Java JDK 的 Set 類 API 的時候會發(fā)現(xiàn):

  1. createSet().add("bar"); // UnsupportedOperationException 

當(dāng)你嘗試修改這個 Set 的時候,就會拋出這個異常,就像你使用了Collections.unmodifiableSet() 方法一樣。我不知道這種情況是否合理,但是你在使用 Kotlin 不可變版本的 Java 集合類的時候,需要謹(jǐn)記這一點。

接口中沒有重載

Kotlin 在接口上不支持使用 @JvmOverloads 注解,當(dāng)然 override 也不行。 

  1. interface Foo { 
  2.     @JvmOverloads // OUCH! 
  3.     fun bar(qux: String) 
  4. class FooImpl : Foo { 
  5.  
  6.     @JvmOverloads // YIKES! 
  7.     override fun bar(qux: String) { 
  8.     } 

你只能像下面這樣手動定義: 

  1. interface Foo { 
  2.     fun bar() 
  3.     fun bar(qux: String) 

要記住你可以使用 Kotlin 中的 KEEP (Kotlin Evolution and Enhancement Process) 來改善。KEEP 與 Java 中的 JEP 類似,但是與 JEP 相比要簡潔許多。

總結(jié)

Kotlin 現(xiàn)下很流行,并且我也認(rèn)為他是一個增強(qiáng)版的 Java。但是在使用 Kotlin 的時候你仍需要保持清醒,尤其是當(dāng)你身處各種各樣的關(guān)于 Kotlin 的宣傳之中時。如果你要使用 Kotlin 的話,一定要注意我們在上面提到的 Kotlin 相關(guān)的缺陷。

***我還是想說,上述提到的問題都比較容易解決,并且不會對語言的使用方面帶來本質(zhì)性的傷害。

責(zé)任編輯:未麗燕 來源: 程序師
相關(guān)推薦

2021-03-01 15:52:14

開源開源軟件陷阱

2021-04-22 11:22:12

云計算數(shù)據(jù)遷移混合云

2018-06-11 15:26:47

云計算企業(yè)云陷阱

2019-02-11 10:00:23

云網(wǎng)絡(luò)云平臺微服務(wù)

2022-09-19 09:19:24

云存儲TCO云服務(wù)

2014-07-11 10:23:54

2015-06-02 11:10:20

2011-06-07 15:34:15

2024-11-06 09:44:22

2025-05-28 03:20:00

布爾值編程True

2021-07-16 10:27:07

ITIT領(lǐng)導(dǎo)IT管理

2013-01-06 10:15:02

大數(shù)據(jù)分析數(shù)據(jù)分析師大數(shù)據(jù)

2013-06-21 10:15:33

BYOD

2022-10-11 07:20:56

YAML字符串語言

2024-03-04 13:23:00

數(shù)字化轉(zhuǎn)型

2022-03-17 18:26:42

微前端

2018-11-18 16:31:14

Kubernetes監(jiān)控容器

2021-02-28 13:19:42

大數(shù)據(jù)IT數(shù)據(jù)管理

2025-04-22 07:10:00

2023-10-04 07:38:20

架構(gòu)架構(gòu)設(shè)計領(lǐng)域
點贊
收藏

51CTO技術(shù)棧公眾號

91av国产精品| 日韩av一二区| 日本成人不卡| 91视视频在线直接观看在线看网页在线看| 97碰碰碰免费色视频| 熟女少妇内射日韩亚洲| 亚洲成人毛片| 精品国产户外野外| 亚洲午夜精品久久久久久浪潮| 国产黄色片网站| 亚洲一区免费| 超碰97人人做人人爱少妇| 在线免费观看污视频| 欧美亚洲二区| 欧美日韩激情视频8区| 亚洲在线视频一区二区| 欧美一级片免费| 久久精品国产亚洲一区二区三区 | 成人欧美一区二区三区在线| 国产无遮挡又黄又爽又色| 欧美一区二区三区高清视频| 欧美精品一区二区久久婷婷| 国产视频1区2区3区| 蜜桃视频动漫在线播放| 亚洲欧美乱综合| 日韩动漫在线观看| 亚洲三区在线播放| 高清视频一区二区| 91久久精品国产91久久| 波多野结衣电影在线播放| 黄色亚洲大片免费在线观看| 在线视频日韩精品| 中文在线一区二区三区| 中文字幕区一区二区三| 777久久久精品| 欧美黄色性生活| 欧美黑人粗大| 色综合欧美在线视频区| 欧美日韩在线一| 黄页网站在线| 亚洲精品国产a久久久久久| 日韩欧美三级电影| 欧美中文在线| 久久婷婷国产综合国色天香| 精品无人区一区二区三区| 亚洲xxx在线| 国产精品一区二区男女羞羞无遮挡| 国产精品久久久久77777| 毛片毛片女人毛片毛片| 99亚洲一区二区| 97免费中文视频在线观看| 国产福利久久久| 一区久久精品| 91国内免费在线视频| 久久久久99精品| 一本不卡影院| 人体精品一二三区| 国产伦精品一区二区三区视频我| 亚洲免费婷婷| 日韩av手机在线看| 在线观看污污网站| 美女视频黄久久| 成人在线中文字幕| 99久久国产热无码精品免费| 国产一区二区影院| 成人一区二区在线| 亚洲欧洲视频在线观看| 久久久精品国产免费观看同学| 欧美另类网站| 国产福利在线视频| 国产精品国产三级国产普通话三级| 婷婷五月色综合| 黄色片网站在线| 一区二区三区欧美日| 800av在线免费观看| а√天堂中文在线资源8| 欧美日韩国产一区在线| 熟女少妇精品一区二区| 日韩福利影视| 欧美tk—视频vk| 欧美黑人欧美精品刺激| 国产亚洲精品美女久久久久久久久久| 在线观看国产精品日韩av| 懂色av蜜臀av粉嫩av永久| 欧美成人亚洲| 欧美亚洲视频在线看网址| 99成人精品视频| 国产一区二区三区国产| 久久er99热精品一区二区三区| 精品99又大又爽又硬少妇毛片| 国产精品国产三级国产| 国产精品va在线观看无码| 小视频免费在线观看| 欧美喷水一区二区| 天天躁日日躁狠狠躁免费麻豆| 亚洲人成网www| 久久av在线看| 中文字幕高清在线免费播放| 激情综合色播五月| 久热这里只精品99re8久 | 先锋影音国产精品| 日韩一区二区在线视频| 日韩福利片在线观看| 日韩国产成人精品| 国产激情一区二区三区在线观看| 国产高清视频在线观看| 亚洲国产成人91porn| 国产三级国产精品国产专区50| 中文字幕一区图| 综合国产在线视频| 国产美女激情视频| 国产成人h网站| 亚洲一区二区精品在线| а√在线天堂官网| 日韩欧美国产精品一区| 三区四区在线观看| 国产精品尤物| 国产精品毛片va一区二区三区| 91最新在线| 欧美视频一区二区三区…| 国模大尺度视频| 日韩欧美大片| 国产aaa精品| 日韩毛片在线一区二区毛片| 亚洲一区二区三区精品在线| 91小视频在线播放| 日韩免费视频| 国产精品色视频| 九色在线播放| 疯狂做受xxxx欧美肥白少妇| 无码人妻久久一区二区三区蜜桃| 五月天久久777| 国产精品日韩专区| xxxxx日韩| 欧洲另类一二三四区| 免费看污黄网站在线观看| 99香蕉国产精品偷在线观看| 国产精品免费在线播放| 日本成人在线播放| 欧美日韩在线三级| 成人在线观看免费高清| 日韩福利电影在线| 色狠狠久久av五月综合| 久久人体大尺度| 亚洲人成绝费网站色www| 国产精品100| 久久伊99综合婷婷久久伊| 国产精品专区在线| 日韩超碰人人爽人人做人人添| 国语自产偷拍精品视频偷 | 亚洲天堂av图片| 天天做天天爱夜夜爽| 91社区在线播放| 成人在线看视频| 国产在线日韩精品| 国产欧美精品一区二区三区-老狼 国产欧美精品一区二区三区介绍 国产欧美精品一区二区 | 欧美一区免费| 国产精品嫩草在线观看| segui88久久综合9999| 日韩av网址在线| 亚洲GV成人无码久久精品| 国产欧美一区二区精品性色| 牛夜精品久久久久久久| 亚洲v在线看| 电影午夜精品一区二区三区| 91美女主播在线视频| 精品亚洲一区二区三区在线观看| 亚洲国产成人无码av在线| 久久久久九九视频| 中文字幕22页| 亚洲第一网站| 色狠狠久久av五月综合| 国产日韩一区二区三免费高清| 精品中文字幕在线观看| 少妇人妻一区二区| 精品视频一区三区九区| 青草影院在线观看| 99精品一区二区| 国产精品久久久久9999小说| 在线国产一区| 久久av一区二区三区漫画| 成人黄色免费观看| 欧美另类在线播放| 欧洲亚洲精品视频| 555夜色666亚洲国产免| 日韩黄色三级视频| 国产精品伦一区| 久久人妻少妇嫩草av蜜桃| 久久亚洲电影| 国产女主播av| 深夜福利久久| julia一区二区中文久久94| 午夜日韩成人影院| 欧美日韩国产二区| 蜜芽tv福利在线视频| 日韩欧美精品在线视频| 亚洲成熟少妇视频在线观看| 亚洲精品久久久蜜桃| 精品无码一区二区三区| 国产高清亚洲一区| www.99av.com| 国产色综合网| 欧美日韩dvd| 日韩欧美精品综合| 久久久com| 一区二区三区四区视频免费观看 | 日韩专区在线播放| 天天干视频在线观看| 在线播放视频一区| 久操视频在线免费观看| 亚洲一区二区精品久久av| 成人免费视频入口| 久久网这里都是精品| 久久av一区二区三| 老色鬼精品视频在线观看播放| 777777av| 国产精品v一区二区三区| 亚洲免费视频一区| 精品久久久亚洲| 九九九九九九精品| 爱爱精品视频| 97中文在线| 日韩毛片免费看| 国产精品成人观看视频国产奇米| 欧美日韩国产观看视频| 色综合天天综合网国产成人网 | 好男人www在线视频| 欧美日韩国产首页| 一级久久久久久| 一本久久综合亚洲鲁鲁五月天| 久久精品视频8| 一区二区三区 在线观看视频 | 亚洲在线久久| 亚洲欧美久久234| 欧美色就是色| 欧洲亚洲一区| 久久99国内| 欧美日韩国产三区| 亚洲宅男网av| 麻豆传媒一区二区| 免费看成人哺乳视频网站| 久久精品第九区免费观看| 国内精品麻豆美女在线播放视频 | 国产精品第二页| 日韩av中字| 日韩美女免费线视频| 欧美黑人粗大| 国产精品网红福利| 日本成人在线网站| 国产综合在线观看视频| 国产精品成人国产| 91精品久久久久久久久久| 亚洲欧洲二区| 亚洲一区二区三区在线视频| 国产高清日韩| 成人免费观看网站| 欧美黑人巨大videos精品| 国语精品中文字幕| 国产在线观看91一区二区三区 | √天堂8资源中文在线| 久久久爽爽爽美女图片| sm性调教片在线观看| 欧美一级电影在线| 99久久综合国产精品二区| 国产日韩欧美日韩| 91精品国产自产精品男人的天堂 | 国产欧美日韩高清| 久久久久久爱| 国产精品一区二区三区免费| 首页亚洲中字| 亚洲国产精品一区二区第四页av| 影音先锋日韩在线| 欧美 国产 综合| 免费观看久久久4p| 韩国三级在线播放| 99国产精品一区| 亚洲黄色网址大全| 亚洲综合精品自拍| 日韩美一区二区| 这里只有精品免费| 日本激情视频网站| 在线视频日韩精品| 日本大片在线播放| 国产精品黄视频| 青草伊人久久| 欧美三级网色| 一区二区中文字| 国产一区二区三区精彩视频 | 激情欧美丁香| 久久久国产欧美| 成人午夜激情视频| 日本黄色小视频在线观看| 亚洲制服丝袜av| 中文字幕有码视频| 日韩免费高清av| 国产三级视频在线看| 久久综合免费视频影院| 国产黄大片在线观看| 国产精品海角社区在线观看| 国产成人澳门| 男人的天堂成人| 天堂一区二区在线| 香蕉视频1024| 国产精品乱码一区二区三区软件| 久久精品久久精品久久| 欧美精品18+| 国产一级片在线| 97国产成人精品视频| 国产亚洲高清一区| 日本一区二区三区视频在线观看| 欧美搞黄网站| www.久久av.com| 国产色一区二区| 欧美福利视频一区二区| 91麻豆精品国产91久久久使用方法 | 日韩精品极品视频| 女人天堂av在线播放| 成人精品久久一区二区三区| 国产欧美一区二区精品久久久| 日韩国产成人无码av毛片| 精一区二区三区| 阿v天堂2014| 色94色欧美sute亚洲13| 五月天婷婷在线观看| 国内久久久精品| 激情久久免费视频| 一区不卡字幕| 蜜臀av性久久久久蜜臀aⅴ流畅| 丰满少妇一区二区三区| 亚洲成av人**亚洲成av**| 国产叼嘿视频在线观看| 久久视频在线直播| 亚洲成人1区| 中文字幕欧美人与畜| 美日韩一区二区| 奇米网一区二区| 欧美日韩激情在线| 777电影在线观看| 国产日韩av高清| 国产精品99久久久久久动医院| 天堂视频免费看| 亚洲欧美自拍偷拍| 国产精品无码白浆高潮| 久久精品人人做人人爽| 精品一区二区三区中文字幕| 日韩精品一区二区三区电影| 国产一区二区在线看| a级片在线观看免费| 日韩你懂的在线观看| 精品日韩av| 精品一区日韩成人| 校园春色综合网| 日韩一区二区a片免费观看| 在线视频综合导航| av在线三区| 亚洲xxxxx| 精品动漫一区| 国产av自拍一区| 欧美日韩在线三级| 午夜av在线免费观看| 国产精品二区三区四区| 在线综合亚洲| 免费污网站在线观看| 欧美日韩久久一区| 亚洲性图自拍| 久久久久久久久久久久久9999| 久久精品男女| 女人18毛片毛片毛片毛片区二| 欧美一区二区三区日韩视频| 日韩少妇视频| 明星裸体视频一区二区| 美日韩一级片在线观看| 欧美日韩在线国产| 日韩av在线电影网| 欧美jizz18| 少妇久久久久久被弄到高潮| 92国产精品观看| 亚洲视频一区在线播放| 欧美激情精品久久久久久| 香蕉视频一区二区三区| www.超碰97.com| 精品福利一区二区| 三区四区在线视频| 国产精品一区二区免费看| 免费一级片91| 国产污片在线观看| 伊人久久精品视频| 中文字幕久久精品一区二区| 粉嫩虎白女毛片人体| 亚洲精品一二三四区| 国产在线色视频| 鬼打鬼之黄金道士1992林正英| 日韩精品久久理论片| 精品97人妻无码中文永久在线| 一个色综合导航| 98视频精品全部国产| 中文字幕22页| 色天使色偷偷av一区二区| 婷婷在线播放| 亚洲欧美精品|