如何編寫可怕的Java代碼?

我決定告訴你如何編寫可怕的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!!!

看起來不錯!函數

在 Java 中沒有什麼是真正的 final

一些開發人員認爲他們經過將 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 序列化,玩得開心,好好享受。優化

好吧,我想你想要一些理由。我看到 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)的大力支持,咱們能夠徹底接受咱們的懶惰。你準備好了嗎?那就開始吧!

  • 永遠不要編寫測試,只是不要編寫錯誤!
  • 將全部都定義爲 public -方便訪問!
  • 支持全局變量–您可能須要它們!
  • 大型接口優於小型專用接口–可使用的方法越多越好!
  • 支持繼承而不是合成(使用接口中的默認方法從未如此簡單)!
  • 始終使用裝箱類型–它們也能夠用做對象!
  • 儘量使用最短的名字(a, b, n 最好)!

不要學習任何新知識–你老是最瞭解

一個程序員最重要的品質就是對本身有信心。相信本身什麼都懂,沒有什麼可學的!

考慮到這一點,請確保不要學習:

  • 新類庫
  • 新語言
  • 新框架

這樣能夠節省你的時間!你永遠都不該學習任何新知識,由於你已是最好的了。

你有能力去作這件事,並不表明你應該作

相關文章
相關標籤/搜索