2014-07-03 8 views
5

Każda właściwość systemowa ustawiona na -Dkey=value może zostać przywrócona jako ciąg znaków przy użyciu System.getProperty("key"). Ale można również uzyskać pewne właściwości systemu odlewano do określonego typu, np .:Które klasy Java mogą pobierać i przesyłać właściwości systemu i dlaczego?

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 

są jakieś inne zajęcia z metody static getSomeClass(String systemPropertyKey)? Dlaczego nie mają ich one, ale inne prymitywne opakowania (lub jakie są przyczyny)?

+2

Zawsze zastanawiałem się, dlaczego metody Boolean, Integer i Long mają te metody, ponieważ nie odnoszą się one do funkcji przypisanych do nich klas. Podejrzewam, że są to wypadki historyczne i nie zostałyby dostarczone, gdyby zostały zrobione od zera. Naprawdę należą do Systemu lub w osobnej klasie Właściwości. –

+1

@HotLicks Dokładnie moje myśli. Te metody są przypisane do niewłaściwych klas i myląco nazwane. –

Odpowiedz

7

Jeśli spojrzeć na realizację np Boolean::getBoolean można zauważyć, że typy wrapper prostu oferować wygodę czytania 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")); 
} 

Powyższa metoda jest tylko wygoda dla pobierania wpisane nieruchomości lub wartość domyślna, jeśli podana wartość jest niedozwolona.

Według mojej wiedzy, tylko takie typy opakowań, jak: Boolean, Long i Integer oferują takie metody. (Typ String ma na przykład not offer such a method, inne niż sugerowane przez twoje pytanie. ') Racjonalne jest prawdopodobnie to, że te prymitywne typy są wspólne dla właściwości, które są przekazywane jako własność systemu. Na przykład normalnie nie wymaga się od użytkownika oferowania struktury XML za pomocą wiersza poleceń, aby wymienić tylko jeden przykład.

Odczytanie właściwości systemowej jest wymaganiem, które jest rozłożone na całą bibliotekę klas Java. Można by umieścić podobny zestaw metod wygody w pakiecie wewnętrznym, ale myślę, że autorzy bibliotek JDK uznali to za wymóg, aby być również istotnymi dla użytkowników spoza JCL i upublicznić go. W końcu typy opakowania mają oferować pewną wygodę w radzeniu sobie z prymitywami. Nie znałbym lepszego miejsca niż typy opakowania, aby zastosować te metody.

Jak zauważył Pablo, wartości dziesiętne nie są uważane za dobrą wartość dla właściwości wiersza poleceń, ponieważ separator dziesiętny jest zależny od lokalizacji. Ponadto nie mogę myśleć o takiej właściwości używanej w JCL. To wyjaśnia, dlaczego podobnej metody nie ma w przypadku Float i Double. Ponadto, ponieważ byte, short i char są reprezentowane w int s w środowisku wykonawczym, nie zobaczyłbym konkretnego przypadku użycia dla tych wartości, co tłumaczyłoby ich brak.

+0

'Float' lub' Double' może mieć problem z ustawieniami narodowymi systemu: w niektórych miejscach separatorem dziesiętnym jest kropka '.', aw innych jest przecinek', '. Również precyzja może być problemem. –

-3

Można utworzyć BigDecimal i wykonać z niego konwersję.

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

To nie odpowiada na pytanie. –

Powiązane problemy