優(yōu)雅編程之阿里巴巴開發(fā)規(guī)范分享及擴展學(xué)習(xí)(三十八)

開心一笑

【小明的前女友開了家小賓館涩馆,小明進(jìn)去吃碗牛肉面冤留,吃完就付錢错负,她前女友說什么都不肯收张症,于是小明把錢放在桌子上就走了,沒想到她前女友追出來把錢塞給了小明。小明就跟他說:“做生意不容易啊,你這樣我以后不來了”。她前女友說:“我不收你錢蔫耽,就是讓你以后別來了!” 這尼瑪就尷尬了......】

提出問題

關(guān)于阿里巴巴Java開發(fā)手冊公開版學(xué)習(xí)和自己加入的一些擴展???

解決問題

元旦快樂

同事發(fā)了一篇很好的文章《阿里巴巴Java開發(fā)手冊公開版》帕棉,針對里面的幾點针肥,在之前文章沒寫到的,分享和擴充下:

0.謙虛香伴,謙虛慰枕,再謙虛

這是作為程序員的第一道關(guān)卡,大神都很謙卑

這是我自己總結(jié)的即纲。

1.不要嫌名字長

無論是方法具帮,變量,還是函數(shù)的取名低斋,不要嫌棄名稱太長蜂厅,只要能夠表示清楚含義就可以了。

2.String[] args而不是String args[]

中括號是數(shù)組類型的一部分膊畴,數(shù)組定義如下:String[] args;

在《Thinking in Java》這邊書里面掘猿,是這么解釋的:

  • 大部分開發(fā)人員,習(xí)慣前一種寫法唇跨。
  • 前一種寫法符合我們的口語化稠通,我們口語通常都說:定義一個字符串?dāng)?shù)組(String 代碼字符,[]代表數(shù)組)
3.POJO 類中的任何布爾類型的變量,都不要加is

POJO類中的任何布爾類型的變量买猖,都不要加 is改橘,否則部分框架解析會引起序列化錯
誤。

大部分經(jīng)典的書籍都有提到這一點玉控,老話題了飞主。

4.各層命名規(guī)約

A) Service/DAO 層方法命名規(guī)約
1) 獲取單個對象的方法用 get 做前綴。
2) 獲取多個對象的方法用 list 做前綴高诺。
3) 獲取統(tǒng)計值的方法用 count 做前綴碌识。
4) 插入的方法用 save(推薦)或 insert 做前綴。
5) 刪除的方法用 remove(推薦)或 delete 做前綴虱而。
6) 修改的方法用 update 做前綴筏餐。

這一點確實很重要,有時候自己都做不到薛窥,規(guī)范大于編碼胖烛。

5.不允許出現(xiàn)任何魔法值(即未經(jīng)定義的常量)
String key="Id#taobao_"+tradeId;
cache.put(key, value);

魔法數(shù)值:是指在代碼中直接出現(xiàn)的數(shù)值诅迷,而只有在這個數(shù)值記述的那部分代碼中才能明確了解其含義佩番。

在這里進(jìn)行擴充下:

魔法數(shù)字的例子

  int priceTable[] = new int[16]; //ERROR:這個16究竟有何含義呢?

使用了帶名字的數(shù)值的例子

解決方法:

static final int PRICE_TABLE_MAX = 16; //OK:帶名字
int price Table[] = new int [PRICE_TABLE_MAX]; //OK:名字的含義是很清楚的
6.多個參數(shù)逗號后邊必須加空格

有時候做項目,心急如焚時罢杉,就會忘記

下例中實參的"a",后邊必須要有一個空格

method("a", "b", "c"); 
7.開發(fā)工具編碼設(shè)置

IDE 的 text file encoding 設(shè)置為 UTF-8; IDE 中文件的換行符使用 Unix 格式趟畏,不
要使用 windows 格式

8.所有的覆寫方法,必須加@Override注解

如果在抽象類中對方法簽名進(jìn)行修改滩租,其實現(xiàn)類會馬上編
譯報錯

《Effective Java》這本書已經(jīng)說的清清楚楚了赋秀,大家可以去啃啃這一節(jié)的內(nèi)容。

9.提倡盡量不用可變參數(shù)編程

相同參數(shù)類型律想,相同業(yè)務(wù)含義猎莲,才可以使用Java的可變參數(shù),避免使用 Object〖技矗可變參數(shù)必須放置在參數(shù)列表的最后

public User getUsers(String type, Integer... ids);
10.基本數(shù)據(jù)類型與包裝數(shù)據(jù)類型的使用標(biāo)準(zhǔn)

1) 所有的POJO類屬性必須使用包裝數(shù)據(jù)類型著洼。
2) RPC方法的返回值和參數(shù)必須使用包裝數(shù)據(jù)類型。
3) 所有的局部變量推薦使用基本數(shù)據(jù)類型而叼。
說明:POJO類屬性沒有初值是提醒使用者在需要使用時身笤,必須自己顯式地進(jìn)行賦值,任何
NPE 問題葵陵,或者入庫檢查液荸,都由使用者來保證。
正例:數(shù)據(jù)庫的查詢結(jié)果可能是 null脱篙,因為自動拆箱娇钱,用基本數(shù)據(jù)類型接收有 NPE 風(fēng)險。
反例:某業(yè)務(wù)的交易報表上顯示成交總額漲跌情況涡尘,即正負(fù) x%忍弛,x 為基本數(shù)據(jù)類型,調(diào)用的
RPC 服務(wù)考抄,調(diào)用不成功時细疚,返回的是默認(rèn)值,頁面顯示:0%川梅,這是不合理的疯兼,應(yīng)該顯示成中劃
線-。所以包裝數(shù)據(jù)類型的 null 值贫途,能夠表示額外的信息吧彪,如:遠(yuǎn)程調(diào)用失敗,異常退出

11.序列化類新增屬性時丢早,請不要修改serialVersionUID字段

避免反序列失敗

12.構(gòu)造方法里面禁止加入任何業(yè)務(wù)邏輯

如果有初始化邏輯姨裸,請放在init方法中

其實這是符合一個方法只做一件事的原則秧倾。

13.POJO 類必須寫 toString 方法

使用工具類 source> generate toString 時,如果繼承了另一個 POJO 類傀缩,注意在前面加一下 super.toString那先。說明:在方法執(zhí)行拋出異常時,可以直接調(diào)用 POJO 的 toString()方法打印其屬性值赡艰,便于排查問題售淡。

貌似我們項目框架中,這一點沒有做到

14.同名的或者相似的方法放置在一起
15.類內(nèi)方法定義順序

類內(nèi)方法定義順序依次是:公有方法或保護方法 > 私有方法 > getter/setter 方法慷垮。

說明: 公有方法是類的調(diào)用者和維護者最關(guān)心的方法揖闸,首屏展示最好;保護方法雖然只是子類
關(guān)心料身,也可能是“模板設(shè)計模式”下的核心方法汤纸;而私有方法外部一般不需要特別關(guān)心,是一
個黑盒實現(xiàn)芹血;因為方法信息價值較低蹲嚣,所有 Service 和 DAO 的 getter/setter 方法放在類體最
后。

16.final可提高程序響應(yīng)效率

final可提高程序響應(yīng)效率祟牲,聲明成final的情況:
1) 不需要重新賦值的變量隙畜,包括類屬性、局部變量说贝。
2) 對象參數(shù)前加final议惰,表示不允許修改引用的指向。
3) 類方法確定不允許被重寫

17.Map/Set的key為自定義對象時乡恕,必須重寫hashCode和equals

String 重寫了 hashCode 和 equals 方法言询,所以我們可以非常愉快地使用String對象作
為 key 來使用。

18.使用集合轉(zhuǎn)數(shù)組的方法傲宜,必須使用集合的 toArray(T[] array)

傳入的是類型完全一樣的數(shù)組运杭,大小就是 list.size()。

反例:直接使用 toArray 無參方法存在問題函卒,此方法返回值只能是 Object[]類辆憔,若強轉(zhuǎn)其它
類型數(shù)組將出現(xiàn) ClassCastException 錯誤。

正例:

List<String> list = new ArrayList<String>(2); 
list.add("guan"); 
list.add("bao"); 
String[] array = new String[list.size()]; 
array = list.toArray(array);  

說明:使用 toArray 帶參方法报嵌,入?yún)⒎峙涞臄?shù)組空間不夠大時虱咧,toArray 方法內(nèi)部將重新分配
內(nèi)存空間,并返回新數(shù)組地址锚国;如果數(shù)組元素大于實際所需腕巡,下標(biāo)為[ list.size() ]的數(shù)組
元素將被置為 null,其它數(shù)組元素保持原值血筑,因此最好將方法入?yún)?shù)組大小定義與集合元素
個數(shù)一致

19.Arrays.asList()把數(shù)組轉(zhuǎn)換成集合時绘沉,不能使用其修改集合相關(guān)的方法

它的 add/remove/clear 方法會拋出 UnsupportedOperationException 異常煎楣。
說明: asList 的返回對象是一個 Arrays 內(nèi)部類,并沒有實現(xiàn)集合的修改方法车伞。 Arrays.asList
體現(xiàn)的是適配器模式转质,只是轉(zhuǎn)換接口,后臺的數(shù)據(jù)仍是數(shù)組帖世。

String[] str = new String[] { "a", "b" };
List  list = Arrays.asList(str);
第一種情況:list.add("c"); 運行時異常。
第二種情況:str[0]= "gujin"; 那么 list.get(0)也會隨之修改沸枯。
20.不要在foreach循環(huán)里進(jìn)行元素的remove/add操作

remove元素請使用Iterator方式日矫,如果并發(fā)操作,需要對 Iterator 對象加鎖绑榴。

反例:

List<String> a = new ArrayList<String>(); 
a.add("1");   
a.add("2"); 
for (String temp : a) { 
    if("1".equals(temp)){ 
        a.remove(temp); 
    } 
} 
21.集合初始化時哪轿,盡量指定集合初始值大小

ArrayList 盡量使用 ArrayList(int initialCapacity) 初始化。

22.使用entrySet遍歷Map類集合KV翔怎,而不是keySet

keySet 其實是遍歷了 2 次窃诉,一次是轉(zhuǎn)為 Iterator 對象,另一次是從 hashMap 中取出 key
所對應(yīng)的 value赤套。而 entrySet 只是遍歷了一次就把 key 和 value 都放到了 entry 中飘痛,效率更
高。如果是 JDK8容握,使用Map.foreach 方法宣脉。

這一點可以參考《Thinking in Java》第17章容器深入研究這一章

23.利用Set元素唯一的特性,可以快速對另一個集合進(jìn)行去重操作

避免使用List的contains 方法進(jìn)行遍歷去重操作剔氏。

24.數(shù)據(jù)庫合適的字符存儲長度

不但節(jié)約數(shù)據(jù)庫表空間塑猖、節(jié)約索引存儲,更重要的是提升檢索速度谈跛。

25.在表查詢中羊苟,一律不要使用 * 作為查詢的字段列表

需要哪些字段必須明確寫明。

說明:1)增加查詢分析器解析成本感憾。2)增減字段容易與resultMap配置不一致蜡励。

26.in操作能避免則避免

若實在避免不了,需要仔細(xì)評估 in 后邊的集合元素數(shù)量阻桅,控制在 1000 個之內(nèi)巍虫。

27.異常信息應(yīng)該包括兩類信息

異常信息應(yīng)該包括兩類信息:案發(fā)現(xiàn)場信息和異常堆棧信息。如果不處理鳍刷,那么往上
拋占遥。

logger.error(各類參數(shù)或者對象 toString + "_" + e.getMessage(), e);
28.if/else/for/while/do 語句中必須使用大括號,即使只有一行代碼

這一點我有點不支持输瓜,比如下面的代碼:

//阿里巴巴建議的寫法
if(a > 0){
    System.out.println(".....");
} 

//對于if邏輯中只有一句話瓦胎,我習(xí)慣下面這么些
if(a > 0) System.out.println(".....");

那個比較好自己對比吧7移肌!搔啊!

29.禁止使用存儲過程

存儲過程難以調(diào)試和擴展柬祠,更沒有移植性

反正我們公司沒用。

30.推薦盡量少用 else负芋, if-else的方式可以改寫成
if(condition){ 
    …
    return obj; 
} 

事實上這個是《重構(gòu)-改善既有代碼設(shè)計》這本書所提倡的漫蛔,多些衛(wèi)語句,具體什么是衛(wèi)語句旧蛾,我在下面參考文章中有一篇鏈接莽龟,大家可以去看。

31.不要在條件判斷中執(zhí)行復(fù)雜的語句

正例:

//偽代碼如下 
InputStream stream = file.open(fileName, "w");  

if (stream != null) {
    …
}

反例:

if (file.open(fileName, "w") != null)) { 
    …
} 
32.線程安全相關(guān)的類使用

SimpleDateFormat 是線程不安全的類锨天,一般不要定義為 static 變量毯盈,如果定義為static,必須加鎖病袄,或者使用 DateUtils 工具類搂赋。

正例:注意線程安全,使用 DateUtils益缠。亦推薦如下處理:

private static final ThreadLocal<DateFormat> df = new ThreadLocal<DateFormat>() { 
    @Override 
    protected DateFormat initialValue() { 
        return new SimpleDateFormat("yyyy-MM-dd"); 
    } 
};

說明:如果是 JDK8 的應(yīng)用脑奠,可以使用 instant 代替 Date,Localdatetime 代替 Calendar幅慌,
Datetimeformatter 代替 Simpledateformatter捺信,官方給出的解釋:simple beautiful strong
immutable thread-safe。

避免 Random 實例被多線程使用欠痴,雖然共享該實例是線程安全的迄靠,但會因競爭同一 seed
導(dǎo)致的性能下降。
說明:Random 實例包括 java.util.Random 的實例或者 Math.random()實例喇辽。
正例:在 JDK7 之后掌挚,可以直接使用 API ThreadLocalRandom,在 JDK7 之前菩咨,可以做到每個線
程一個實例吠式。

33.類、類屬性抽米、類方法的注釋必須使用 javadoc 規(guī)范

類特占、類屬性、類方法的注釋必須使用 javadoc 規(guī)范云茸,使用/*內(nèi)容/格式是目,不得使用//xxx 方式。

方法內(nèi)部單行注釋标捺,在被注釋語句上方另起一行懊纳,使用//注釋揉抵。方法內(nèi)部多行注釋使
用/* */注釋,注意與代碼對齊

可以參考《代碼整潔之道》這本書中的注釋這一章嗤疯,里面內(nèi)容更加纖細(xì)冤今。

34.刪除被注釋掉的沒用的東西

對于“明確停止使用的代碼和配置”,如方法茂缚、變量戏罢、類、配置文件脚囊、動態(tài)配置屬性
等要堅決從程序中清理出去龟糕,避免造成過多垃圾。清理這類垃圾代碼是技術(shù)氣場凑术,不要有這樣
的觀念:“不做不錯,多做多錯”所意。

35.獲取當(dāng)前毫秒數(shù):System.currentTimeMillis()

而不是 new Date().getTime();

說明:如果想獲取更加精確的納秒級時間值淮逊,用 System.nanoTime。在 JDK8 中扶踊,針對統(tǒng)計時
間等場景泄鹏,推薦使用 Instant 類。

【強制】線程資源必須通過線程池提供秧耗,不允許在應(yīng)用中自行顯式創(chuàng)建線程备籽。
說明: 使用線程池的好處是減少在創(chuàng)建和銷毀線程上所花的時間以及系統(tǒng)資源的開銷,解決資
源不足的問題分井。如果不使用線程池车猬,有可能造成系統(tǒng)創(chuàng)建大量同類線程而導(dǎo)致消耗完內(nèi)存或者
“過度切換”的問題。

36.所有的類都必須添加創(chuàng)建者信息尺锚。

事實上珠闰,我個人建議,每個方法都要寫上創(chuàng)建者姓名瘫辩,這樣出現(xiàn)問題比較好排查

出現(xiàn)問題伏嗜,分分鐘弄死它。

37.代碼修改的同時伐厌,注釋也要進(jìn)行相應(yīng)的修改

尤其是參數(shù)承绸、返回值、異常挣轨、核心邏輯等的修改军熏。

38.任何數(shù)據(jù)結(jié)構(gòu)的使用都應(yīng)限制大小

說明:這點很難完全做到,但很多次的故障都是因為數(shù)據(jù)結(jié)構(gòu)自增長卷扮,結(jié)果造成內(nèi)存被吃光羞迷。

39.日志文件推薦至少保存 15 天

因為有些異常具備以“周”為頻次發(fā)生的特點界轩。

40.對trace/debug/info級別的日志輸出,必須使用條件輸出形式

或者使用占位符的方式衔瓮。

說明:logger.debug("Processing trade with id: " + id + " symbol: " + symbol); 如果
日志級別是 warn浊猾,上述日志不會打印,但是會執(zhí)行字符串拼接操作热鞍,如果 symbol 是對象葫慎,會
執(zhí)行 toString()方法,浪費了系統(tǒng)資源薇宠,執(zhí)行了上述操作偷办,最終日志卻沒有打印。

正例:(條件)

if (logger.isDebugEnabled()) { 
logger.debug("Processing trade with id: " + id + " symbol: " + symbol); 
} 

正例:(占位符)

logger.debug("Processing trade with id: {} and symbol : {} ", id, symbol);
41.特殊注釋標(biāo)記澄港,請注明標(biāo)記人與標(biāo)記時間

注意及時處理這些標(biāo)記椒涯,通過標(biāo)記掃描,經(jīng)常清理此類標(biāo)記回梧。線上故障有時候就是來源于這些標(biāo)記處的代碼废岂。

  • 1) 待辦事宜(TODO):( 標(biāo)記人,標(biāo)記時間狱意,[預(yù)計處理時間])
    表示需要實現(xiàn)湖苞,但目前還未實現(xiàn)的功能。這實際上是一個 javadoc 的標(biāo)簽详囤,目前的
    javadoc 還沒有實現(xiàn)财骨,但已經(jīng)被廣泛使用。 只能應(yīng)用于類藏姐,接口和方法(因為它是一個 javadoc
    標(biāo)簽)隆箩。
  • 2) 錯誤,不能工作(FIXME):(標(biāo)記人羔杨,標(biāo)記時間摘仅,[預(yù)計處理時間])
    在注釋中用 FIXME 標(biāo)記某代碼是錯誤的,而且不能工作问畅,需要及時糾正的情況娃属。
42.避免用Apache Beanutils 進(jìn)行屬性的 copy

說明:Apache BeanUtils 性能較差护姆,可以使用其他方案比如 Spring BeanUtils, Cglib
BeanCopier矾端。

以后會專門寫一篇關(guān)于這方面的文章,敬請期待

43.注意HashMap的擴容死鏈

導(dǎo)致 CPU 飆升的問題

44.應(yīng)用中的擴展日志(如打點卵皂、臨時監(jiān)控秩铆、訪問日志等)命名方式

appName_logType_logName.log。logType:日志類型,推薦分類有 stats/desc/monitor/visit
等殴玛;logName:日志描述捅膘。這種命名的好處:通過文件名就可知道日志文件屬于什么應(yīng)用,什么類型滚粟,什么目的寻仗,也有利于歸類查找。

45.高并發(fā)時凡壤,同步調(diào)用應(yīng)該去考量鎖的性能損耗

能用無鎖數(shù)據(jù)結(jié)構(gòu)署尤,就不要用鎖;能鎖區(qū)塊亚侠,就不要鎖整個方法體曹体;能用對象鎖,就不要用類鎖硝烂。

46在代碼中使用“拋異郴穑”還是“返回錯誤碼”

對于公司外的 http/api 開放接口必須使用“錯誤碼”;而應(yīng)用內(nèi)部推薦異常拋出滞谢;跨應(yīng)用間 RPC 調(diào)用優(yōu)先考慮使用 Result 方式串稀,封裝 isSuccess、“錯誤碼”爹凹、“錯誤簡短信息”厨诸。

說明:關(guān)于 RPC 方法返回方式使用 Result 方式的理由:
1)使用拋異常返回方式镶殷,調(diào)用方如果沒有捕獲到就會產(chǎn)生運行時錯誤禾酱。
2)如果不加棧信息,只是 new 自定義異常绘趋,加入自己的理解的 error message颤陶,對于調(diào)用
端解決問題的幫助不會太多。如果加了棧信息陷遮,在頻繁調(diào)用出錯的情況下滓走,數(shù)據(jù)序列化和傳輸
的性能損耗也是問題。

47.謹(jǐn)慎地記錄日志帽馋。生產(chǎn)環(huán)境禁止輸出 debug 日志

有選擇地輸出 info 日志搅方;如果使用 warn 來記錄剛上線時的業(yè)務(wù)行為信息,一定要注意日志輸出量的問題绽族,避免把服務(wù)器磁盤撐爆姨涡,并記得及時刪除這些觀察日志。

說明:大量地輸出無效日志吧慢,不利于系統(tǒng)性能提升涛漂,也不利于快速定位錯誤點。紀(jì)錄日志時請
思考:這些日志真的有人看嗎?看到這條日志你能做什么匈仗?能不能給問題排查帶來好處瓢剿?

48.單表行數(shù)超過 500 萬行或者單表容量超過 2GB,才推薦進(jìn)行分庫分表悠轩。

讀書感悟

來自 尼爾.唐納徳.沃爾什《與神對話》

  • 最高的思維永遠(yuǎn)是那包含著喜悅的思維间狂,最清楚的話語永遠(yuǎn)是那些包含著真理的話語暴心,最崇高的感受识颊,就是你們稱為愛的那種感受
  • 如果你愿意聽,我將會與你說話卑笨。如果你愿意邀請我距潘,我將會來找你炼列。到時我將會讓你看到,我一直都在音比。以各種各樣的方式俭尖。
  • 尷尬是仍然在意別人如何看待自己的人才會有的反應(yīng)
  • 別妒忌成功,別憐憫失敗洞翩,因為你不知道在靈魂的權(quán)衡中稽犁,什么算成功,什么算失敗骚亿。遇事別稱其災(zāi)難或歡樂已亥,除非你已確定或見證它的用途。因為来屠,如果死拯救了數(shù)以千計的生命虑椎,它還能被稱為災(zāi)難嗎?如果生只帶來悲哀俱笛,它還能被稱為歡樂嗎捆姜?然而就算這個你也別去判斷,你永遠(yuǎn)走你的路迎膜,同時允許別人走他們的路就可以了泥技。
  • 完美人生的三大核心: 1.清醒 2.誠信 3.負(fù)責(zé)

經(jīng)典故事

【一只小豬、一只綿羊和一頭乳牛磕仅,被關(guān)在同一個畜欄里珊豹。有一次,牧人捉住小豬榕订,他大聲號叫店茶,猛烈地抗拒。綿羊和乳牛討厭它的號叫卸亮,便說:“他常常捉我們忽妒,我們并不大呼小叫。”小豬聽了回答道:“捉你們和捉我完全是兩回事段直,他捉你們吃溅,只是要你們的毛和乳汁,但是捉住我鸯檬,是要我的命的 ? ”
立場不同决侈、所處環(huán)境不同的人,很難了解對方的感受喧务;因此對別人的失意赖歌、挫折、傷痛 功茴,不宜幸災(zāi)樂禍庐冯,而應(yīng)要有關(guān)懷、了解的心情坎穿。要有寬容的心展父!】

元旦快樂

參考文章

【1】java中的魔法數(shù)
【2】阿里巴巴Java開發(fā)手冊公開版
【3】SQL Server-聚焦EXISTS AND IN性能分析(十六)
【4】衛(wèi)語句
【5】《Thinking in Java》書籍(Java編程思想)
【6】《Effective Java第二版》書籍
【7】《代碼整潔之道》書籍
【8】《重構(gòu)-改善既有代碼設(shè)計》書籍
【9】數(shù)據(jù)脫敏技術(shù)

其他

如果有帶給你一絲絲小快樂,就讓快樂繼續(xù)傳遞下去玲昧,歡迎點贊栖茉、頂、歡迎留下寶貴的意見孵延、多謝支持吕漂!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市尘应,隨后出現(xiàn)的幾起案子惶凝,更是在濱河造成了極大的恐慌,老刑警劉巖菩收,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件梨睁,死亡現(xiàn)場離奇詭異鲸睛,居然都是意外死亡娜饵,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進(jìn)店門官辈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來箱舞,“玉大人,你說我怎么就攤上這事拳亿∏绻桑” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵肺魁,是天一觀的道長电湘。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么寂呛? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任怎诫,我火速辦了婚禮,結(jié)果婚禮上贷痪,老公的妹妹穿的比我還像新娘幻妓。我一直安慰自己,他們只是感情好劫拢,可當(dāng)我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布肉津。 她就那樣靜靜地躺著,像睡著了一般舱沧。 火紅的嫁衣襯著肌膚如雪妹沙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天熟吏,我揣著相機與錄音初烘,去河邊找鬼。 笑死分俯,一個胖子當(dāng)著我的面吹牛肾筐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播缸剪,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼吗铐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了杏节?” 一聲冷哼從身側(cè)響起唬渗,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎奋渔,沒想到半個月后镊逝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡嫉鲸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年撑蒜,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片玄渗。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡座菠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出藤树,到底是詐尸還是另有隱情浴滴,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布岁钓,位于F島的核電站升略,受9級特大地震影響微王,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜品嚣,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一骂远、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧腰根,春花似錦激才、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至册养,卻和暖如春东帅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背球拦。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工靠闭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人坎炼。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓愧膀,卻偏偏與公主長得像,于是被迫代替她去往敵國和親谣光。 傳聞我的和親對象是個殘疾皇子檩淋,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容