2013-05-31 90 views
3

我在寫一個小型庫。靜態方法或實例方法中的實際代碼

public class MyClass { 

    public static String doSomethingWithString(final String s) { 
     new MyClass().doSomething(s); 
    } 

    public String doSomething(final String s) { 
     return null; 
    } 
} 

或者我可以這樣做。

public class MyClass { 

    public static String doSomethingWithString(final String s) { 
     return null; 
    } 

    public String doSomething(final String s) { 
     return doSomethingWithString(s); 
    } 
} 

哪種風格更適合?他們是一樣的嗎?

UPDATE

感謝您的意見和解答。

這裏有兩個類。

public class IdEncoder { 

    private static String block(final long decoded) { 
     final StringBuilder builder = new StringBuilder(Long.toString(decoded)); 
     builder.append(Integer.toString(
      ThreadLocalRandom.current().nextInt(9) + 1)); // 1-9 
     builder.append(Integer.toString(
      ThreadLocalRandom.current().nextInt(9) + 1)); // 1-9 
     builder.reverse(); 
     return Long.toString(
      Long.parseLong(builder.toString()), Character.MAX_RADIX); 
    } 

    public static String encodeLong(final long decoded) { 
     return block(decoded >>> 0x20) + "-" + block(decoded & 0xFFFFFFFFL); 
    } 

    public String encode(final long decoded) { 
     return encodeLong(decoded); 
    } 
} 

另一種風格。

public class IdDecoder { 

    public static long decodeLong(final String encoded) { 
     return new IdDecoder().decode(encoded); 
    } 

    public long decode(final String encoded) { 
     final int index = encoded.indexOf('-'); 
     if (index == -1) { 
      throw new IllegalArgumentException("wrong encoded: " + encoded); 
     } 
     return (block(encoded.substring(0, index)) << 32) 
       | (block(encoded.substring(index + 1))); 
    } 

    private long block(final String encoded) { 
     final StringBuilder builder = new StringBuilder(
      Long.toString(Long.parseLong(encoded, Character.MAX_RADIX))); 
     builder.reverse(); 
     builder.deleteCharAt(builder.length() - 1); 
     builder.deleteCharAt(builder.length() - 1); 
     return Long.parseLong(builder.toString()); 
    } 
} 
+2

你想做什麼?爲什麼? – Elazar

+0

這段代碼沒有做任何事情,所以很難給出有用的建議... –

+0

我只是好奇。我目前在做第一種風格。我不知道改變第二種風格可能會產生一些可能的影響。 –

回答

3

如果你只是選擇這兩個選項之間,拿第二個選項。

原因是第一個要求你在堆上分配一個新的虛擬對象只是爲了調用一個方法。如果真的沒有其他區別,不要浪費時間和空間,只需調用課堂上的靜態方法即可。

第二個更類似於靜態效用函數,這是一個很好的編碼實踐。

+0

靜態效用方法的缺點是它們很難擴展行爲。當然,在某些情況下,這是預期的,但值得考慮的可能性是您的課程的用戶可能想要擴展您定義的行爲。在這種情況下,實例方法是優越的。 – dimo414

+0

我不會不同意。使用實例方法肯定有很多次(可能是最多次)。在這種情況下,雖然可能沒有必要,因爲它實例化一個默認對象只是爲了調用顯然可以是靜態的東西。 – greedybuddha

2

編寫庫時,易用性顯着勝過常規最佳實踐。如果用戶無法通過實例化某些內容來訪問它,則該方法應該是靜態的。然而,實際上,對於一個方法來說,它實際上更清晰和更強大,因爲它允許用戶(以及庫編寫器)在子類中覆蓋它。

從某種意義上說,你實際上並不是在問一個編程問題,而是一個用戶體驗問題。問問你自己,如何讓你的用戶從訪問你的代碼中受益最大,並以這種方式實現它。作爲一個很好的基準,請看Guava API;它由許多靜態實用程序類組成,但同樣多的類和接口設計得很容易擴展。做你認爲最好的。