我決定告訴你如何編寫可怕的Java代碼。若是你厭倦了全部這些美麗的設計模式和最佳實踐,而且想寫些瘋狂的東西,請繼續閱讀。程序員
若是你正在尋找有關如何編寫良好代碼的建議,請查看其它文章!編程
你知道循環對嗎?差一錯誤(英語:Off-by-one error,縮寫 OBOE,是在計數時因爲邊界條件判斷失誤致使結果多了一或少了一的錯誤,一般指計算機編程中循環多了一次或者少了一次的程序錯誤,屬於邏輯錯誤的一種)很容易犯。當你迭代一個集合時,很容易出錯。讓咱們看看如何使用 Java 異常處理來解決該問題,而不用擔憂這些討厭的差一錯誤!設計模式
public static void horribleIteration(String [] words){ int i = 0; try { while(true){ System.out.println(words[i]); i++; } } catch (IndexOutOfBoundsException e){ //iteration complete } }
你說什麼?Java 中的訪問修飾符,這不是浪費時間嘛!你是否知道將屬性/方法等設爲私有隻是一個建議?若是你想修改它,那就去作吧!沒什麼能阻止你(除了缺少知識以外)。若是是這種狀況,請看以下代碼。安全
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 發生了什麼:架構
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!!!
看起來不錯!函數
一些開發人員認爲他們經過將 final 關鍵字放在變量前面來以說明不會去更改這個值。事實是——有時候你真的想要改變一個 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; } }
注意,在構造函數中提供最終值時,這對我頗有用。若是你在類中設置了 final 值,那麼它將不起做用。(多是一些編譯器級別的優化破壞了全部的樂趣)測試
這很簡單,用 Java 序列化,玩得開心,好好享受。優化
好吧,我想你想要一些理由。我看到 Java 平臺首席架構師 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 進行操做的開始。若是有疑問,請記住-使用對象。若是須要,你隨時可使用這種驚人的模式進行回退!
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 } }
這仍是類型安全的,多麼健壯的解決方案。
你知道比爾·蓋茨更喜歡懶惰的開發人員嗎?比爾·蓋茨說過:
"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)的大力支持,咱們能夠徹底接受咱們的懶惰。你準備好了嗎?那就開始吧!
一個程序員最重要的品質就是對本身有信心。相信本身什麼都懂,沒有什麼可學的!
考慮到這一點,請確保不要學習:
這樣能夠節省你的時間!你永遠都不該學習任何新知識,由於你已是最好的了。
你有能力去作這件事,並不表明你應該作