我決定告訴你如何編寫可怕的Java代碼。如果你厭倦了所有這些美麗的設(shè)計模式和最佳實踐徒扶,并且想寫些瘋狂的東西粮彤,請繼續(xù)閱讀。
如果你正在尋找有關(guān)如何編寫良好代碼的建議姜骡,請查看其它文章导坟!
對一切使用異常
你知道循環(huán)對嗎?差一錯誤(英語:Off-by-one error圈澈,縮寫 OBOE惫周,是在計數(shù)時由于邊界條件判斷失誤導(dǎo)致結(jié)果多了一或少了一的錯誤,通常指計算機(jī)編程中循環(huán)多了一次或者少了一次的程序錯誤康栈,屬于邏輯錯誤的一種)很容易犯递递。當(dāng)你迭代一個集合時,很容易出錯啥么。讓我們看看如何使用 Java 異常處理來解決該問題登舞,而不用擔(dān)心這些討厭的差一錯誤!
public static void horribleIteration(String [] words){
int i = 0;
try {
while(true){
System.out.println(words[i]);
i++;
}
} catch (IndexOutOfBoundsException e){
//iteration complete
}
}
不用擔(dān)心訪問修飾符
你說什么饥臂?Java 中的訪問修飾符,這不是浪費時間嘛似踱!你是否知道將屬性/方法等設(shè)為私有只是一個建議隅熙?如果你想修改它,那就去做吧核芽!沒什么能阻止你(除了缺乏知識之外)囚戚。如果是這種情況,請看如下代碼轧简。
public static void readPrivate() throws NoSuchFieldException, IllegalAccessException {
Field f = System.class.getDeclaredField("lineSeparator");
f.setAccessible(true);
String separator = (String) f.get(System.class);
System.out.println("Line separator is " + separator + ".");
}
我們在這里讀取 lineSeparator驰坊,這并沒有什么。但是修改 lineSeparator 會帶來更多樂趣哮独!在我們修改代碼中的 lineSeparator 之后拳芙,看看 System.out.println 發(fā)生了什么:
public static void readWritePrivate() throws NoSuchFieldException, IllegalAccessException {
Field f = System.class.getDeclaredField("lineSeparator");
f.setAccessible(true);
String separator = (String) f.get(System.class);
System.out.println("Line separator is " + separator + ".");
f.set(System.class ,"!!!");
System.out.println("Line one");
System.out.println("Line two");
System.out.println("Line three");
}
輸出為:
Line separator is
WARNING: All illegal access operations will be denied in a future release
.
Line one!!!Line two!!!Line three!!!
看起來不錯!
在 Java 中沒有什么是真正的 final
一些開發(fā)人員認(rèn)為他們通過將 final 關(guān)鍵字放在變量前面來以說明不會去更改這個值。事實是——有時候你真的想要改變一個 final 字段的值皮璧,所以這是如何做的:
public static void notSoFinal() throws NoSuchFieldException, IllegalAccessException, InterruptedException {
ExampleClass example = new ExampleClass(10);
System.out.println("Final value was: "+ example.finalValue);
Field f = example.getClass().getDeclaredField("finalValue");
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(f, f.getModifiers() & ~Modifier.FINAL);
f.setInt(example, 77);
System.out.println("Final value was: "+ example.finalValue);
}
public static class ExampleClass {
final int finalValue;
public ExampleClass(int finalValue){
this.finalValue = finalValue;
}
}
注意舟扎,在構(gòu)造函數(shù)中提供最終值時,這對我很有用悴务。如果你在類中設(shè)置了 final 值睹限,那么它將不起作用。(可能是一些編譯器級別的優(yōu)化破壞了所有的樂趣)
使用 Java 序列化,干就對了
這很簡單羡疗,用 Java 序列化染服,玩得開心,好好享受叨恨。
好吧柳刮,我想你想要一些理由。我看到 Java 平臺首席架構(gòu)師 Mark Reinhold 表示特碳,他們后悔將序列化引入到 Java诚亚。顯然,Java 中大約 1/3 的安全漏洞僅來自于序列化午乓。
將對象用于一切
你知道類嗎站宗?浪費時間!你是否想看到代碼重用的巔峰之作益愈?你去梢灭!
public static void printThings (List things){
int i = 0;
try {
while(true){
System.out.println(things.get(i));
i++;
}
} catch (IndexOutOfBoundsException e){
//iteration complete
}
}
List superList = new ArrayList();
superList.add(7);
superList.add("word");
superList.add(true);
superList.add(System.class);
printThings(superList);
您可以相信我們一直以來都擁有這種力量嗎?另外蒸其,組合兩個模式還有額外的好處!
這只是你使用 Object 進(jìn)行操作的開始敏释。如果有疑問,請記住-使用對象摸袁。如果需要钥顽,你隨時可以使用這種驚人的模式進(jìn)行回退!
public static void printThingsUppercaseStrings (List things){
int i = 0;
try {
while(true){
Object o = things.get(i);
System.out.println(o);
if(o.getClass() == String.class){
String so = (String) o;
so = so.toUpperCase();
System.out.println(so);
}
i++;
}
} catch (IndexOutOfBoundsException e){
//iteration complete
}
}
這還是類型安全的靠汁,多么健壯的解決方案蜂大。
充分擁抱便捷編程的藝術(shù)
你知道比爾·蓋茨更喜歡懶惰的開發(fā)人員嗎?比爾·蓋茨說過:
"I will always choose a lazy person to do a difficult job...because, he will find an easy way to do it. --Bill Gates"
"我總是會選擇一個懶人去完成一份困難的工作...因為蝶怔,他會找到捷徑奶浦。" -- 比爾蓋茨
因此,有了比爾·蓋茨(Bill Gates)的大力支持踢星,我們可以完全接受我們的懶惰澳叉。你準(zhǔn)備好了嗎?那就開始吧沐悦!
- 永遠(yuǎn)不要編寫測試成洗,只是不要編寫錯誤!
- 將所有都定義為 public -方便訪問藏否!
- 支持全局變量–您可能需要它們泌枪!
- 大型接口優(yōu)于小型專用接口–可以使用的方法越多越好!
- 支持繼承而不是合成(使用接口中的默認(rèn)方法從未如此簡單)秕岛!
- 始終使用裝箱類型–它們也可以用作對象碌燕!
- 盡可能使用最短的名字(a, b, n 最好)误证!
不要學(xué)習(xí)任何新知識–你總是最了解
一個程序員最重要的品質(zhì)就是對自己有信心。相信自己什么都懂修壕,沒有什么可學(xué)的愈捅!
考慮到這一點,請確保不要學(xué)習(xí):
- 新類庫
- 新語言
- 新框架
這樣可以節(jié)省你的時間慈鸠!你永遠(yuǎn)都不應(yīng)學(xué)習(xí)任何新知識蓝谨,因為你已經(jīng)是最好的了。
你有能力去做這件事,并不代表你應(yīng)該做