2014-07-03 36 views
5

任何使用-Dkey=value設置的系統屬性都可以使用System.getProperty("key")作爲字符串檢索。但你也可以得到澆鑄爲特定類型的某些系統特性,例如:哪些Java類可以獲取並投射系統屬性,爲什麼?

Boolean.getBoolean("key"); //Returns true if value==true 
Integer.getInteger("key"); //Returns value if exists & is number, else null 
Long.getLong("key"); //Ditto as for Integer 

是否還有其他班級,static getSomeClass(String systemPropertyKey)方法?爲什麼不Byte,FloatDouble有他們,但其他原始包裝做(或什麼可能是原因)?

+2

我一直想知道爲什麼布爾,Integer和Long有這些方法,因爲它們並不真正涉及到它們相關的類的功能。我懷疑他們是歷史事故,如果從零開始完成,將不會提供。他們真的屬於系統或一些單獨的屬性類。 –

+1

@HotLicks完全是我的想法。這些方法被附加到錯誤的類,並誤導性地命名。 –

回答

7

如果你考慮的,例如Boolean::getBoolean你會發現,在包裝類型簡單地提供一些方便閱讀System::getProperty實施:

public static boolean getBoolean(String name) { 
    boolean result = false; 
    try { 
     result = toBoolean(System.getProperty(name)); 
    } catch (IllegalArgumentException e) { 
    } catch (NullPointerException e) { 
    } 
    return result; 
} 

private static boolean toBoolean(String name) { 
    return ((name != null) && name.equalsIgnoreCase("true")); 
} 

以上方法只用於檢索類型的屬性或便利如果給定的值是非法的,則爲默認值。

據我所知,只有包裝類型Boolean,LongInteger提供這樣的方法。 (例如,String類型確實是not offer such a method,而不是你的問題所暗示的。')理性可能是這些原始類型對於作爲系統屬性移交的屬性而言很常見。例如,您通常不需要用戶通過命令行提供XML結構,僅舉一個例子。

讀取系統屬性是遍佈Java類庫的要求。人們可以將一組類似的便利方法放入內部包中,但我想JDK庫的作者認爲這是與JCL之外的用戶相關並要求公開的要求。最後,包裝類型意味着爲處理基元提供了一些便利。我不知道比包裝類型更好的地方放這些方法。

正如Pablo指出的那樣,十進制值對於命令行屬性來說不是一個很好的值,因爲它是與語言環境相關的小數點分隔符。另外,我想不出JCL中使用的這種屬性。這可以解釋爲什麼從FloatDouble中缺少類似的方法。另外,因爲byteshortchar在運行時表示爲int,所以我不會看到這些值的特定用例,或者解釋它們不存在。

+0

'Float'或'Double'會對系統的區域設置有問題:在某些地方,小數點分隔符是點「。」,其他位置是逗號','。精度也可能是一個問題。 –

-3

您可以創建一個BigDecimal並從中進行轉換。

String myNumber = "10.23"; 
BigDecimal myDecimal = new BigDecimal(myNumber); 
double myDouble = myDecimal.doubleValue(); 
int myInt = myDecimal.intValue(); 
long myLong = myDecimal.longValue(); 
BigInteger myBigInteger = myDecimal.toBigInteger(); 
+3

這實際上並沒有回答這個問題。 –