2014-07-03 6 views
5

Alle Systemeigenschaften, die mit -Dkey=value festgelegt wurden, können unter Verwendung von System.getProperty("key") als String abgerufen werden. Sie können aber auch bestimmte Systemeigenschaften auf einen bestimmten Typ gegossen erhalten, z.B .:Welche Java-Klassen können Systemeigenschaften abrufen und übertragen und warum?

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 

Gibt es irgendwelche anderen Klassen mit einem static getSomeClass(String systemPropertyKey) Methode? Warum haben Byte, Float oder Double sie nicht, aber die anderen primitiven Wrapper tun (oder was könnte der Grund sein)?

+2

Ich habe mich immer gefragt, warum Boolean, Integer und Long diese Methoden haben, da sie sich nicht wirklich auf die Funktion ihrer zugeordneten Klassen beziehen. Ich vermute, sie sind Unfälle der Geschichte und würden nicht zur Verfügung gestellt, wenn es von Grund auf neu gemacht würde. Sie gehören wirklich in System oder in einer separaten Properties-Klasse. –

+1

@HotLicks Genau meine Gedanken. Diese Methoden sind den falschen Klassen zugeordnet und werden fälschlicherweise benannt. –

Antwort

7

Wenn man sich in die Umsetzung von beispielsweise Boolean::getBoolean Sie werden feststellen, dass der Wrapper-Typ einfach etwas Bequemlichkeit bieten System::getProperty zum Lesen:

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")); 
} 

Das oben beschriebene Verfahren nur eine Bequemlichkeit ist eine typisierte Eigenschaft oder eines für das Abrufen Standardwert, wenn der angegebene Wert unzulässig ist.

Nach meinem Wissen bieten nur die Wrapper-Typen,, und Integer solche Methoden an. (Der String Typ ist zum Beispiel not offer such a method, anders als durch Ihre Frage impliziert. ') Die rationale ist wahrscheinlich die Tatsache, dass diese primitiven Typen für Eigenschaften, die als eine Systemeigenschaft übergeben werden, üblich sind. Sie würden beispielsweise normalerweise nicht verlangen, dass ein Benutzer eine XML-Struktur über die Befehlszeile anbietet, um nur ein Beispiel zu nennen.

Das Lesen einer Systemeigenschaft ist eine Anforderung, die über die gesamte Java-Klassenbibliothek verteilt ist. Man hätte ähnliche Convenience-Methoden in ein internes Paket einbauen können, aber ich denke, dass die Autoren der JDK-Bibliotheken dies als eine Anforderung betrachteten, die auch für Benutzer außerhalb der JCL relevant sein sollte, und sie öffentlich gemacht haben. Am Ende sollen die Wrappertypen etwas Bequemlichkeit für den Umgang mit Primitiven bieten. Ich würde keinen besseren Ort als die Wrapper-Typen kennen, um diese Methoden zu verwenden.

Wie von Pablo hervorgehoben, werden Dezimalwerte nicht als guter Wert für eine Befehlszeileneigenschaft betrachtet, da das Dezimaltrennzeichen länderabhängig ist. Außerdem kann ich nicht an eine solche Eigenschaft denken, die in der JCL verwendet wird. Dies würde erklären, warum eine ähnliche Methode von Float und Double fehlt. Auch weil byte, short und char bei int s zur Laufzeit dargestellt werden, würde ich keinen besonderen Anwendungsfall für diese Werte sehen, was ihre Abwesenheit erklären würde.

+0

'Float' oder' Double' würde ein Problem mit dem Gebietsschema des Systems haben: an einigen Stellen ist das Dezimaltrennzeichen der Punkt '.' und in anderen ist das Komma', '. Auch Präzision könnte ein Problem sein. –

-3

Sie können ein BigDecimal erstellen und die Konvertierung von diesem durchführen.

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

Dies beantwortet die Frage nicht wirklich. –