#java #system-properties
#java #системные свойства
Вопрос:
Любое системное свойство, установленное с помощью -Dkey=value
, может быть получено в виде строки с помощью System.getProperty("key")
. Но вы также можете привести определенные системные свойства к определенному типу, например:
Boolean.getBoolean("key"); //Returns true if value==true
Integer.getInteger("key"); //Returns value if exists amp; is number, else null
Long.getLong("key"); //Ditto as for Integer
Существуют ли какие-либо другие классы с static getSomeClass(String systemPropertyKey)
методом? Почему их нет Byte
, Float
или Double
есть у них, но есть у других примитивных оболочек (или в чем могла быв этом быть причина)?
Комментарии:
1. Мне всегда было интересно, почему у Boolean, Integer и Long есть эти методы, поскольку они на самом деле не связаны с функцией связанных с ними классов. Я подозреваю, что они являются случайностями истории и не были бы предоставлены, если бы это было сделано с нуля. Они действительно принадлежат System или какому-то отдельному классу Properties.
2. @HotLicks — это именно мои мысли. Эти методы привязаны к неправильным классам и названы неверно.
Ответ №1:
Если вы посмотрите на реализацию, например, 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 resu<
}
private static boolean toBoolean(String name) {
return ((name != null) amp;amp; name.equalsIgnoreCase("true"));
}
Приведенный выше метод удобен только для извлечения типизированного свойства или значения по умолчанию, если данное значение является недопустимым.
Насколько мне известно, только типы оболочек Boolean
, Long
и Integer
предлагают такие методы. ( String
Тип, например, не предлагает такого метода, кроме того, что подразумевается в вашем вопросе.’) Рациональным, вероятно, является тот факт, что эти примитивные типы являются общими для свойств, которые передаются как системное свойство. Например, обычно не требуется, чтобы пользователь предлагал структуру XML с помощью командной строки, просто назову один пример.
Чтение системного свойства — это требование, которое распространяется по всей библиотеке классов Java. Можно было бы поместить аналогичный набор удобных методов во внутренний пакет, но я предполагаю, что авторы библиотек JDK посчитали, что это требование должно быть также актуальным для пользователей за пределами JCL и сделали его общедоступным. В конце концов, типы оболочек предназначены для обеспечения некоторого удобства при работе с примитивами. Я бы не знал лучшего места, чем типы оболочек, для размещения этих методов.
Как указал Пабло, десятичные значения не считаются подходящим значением для свойства командной строки, поскольку десятичный разделитель зависит от локали. Кроме того, я не могу вспомнить о таком свойстве, используемом в JCL. Это объясняет, почему аналогичный метод отсутствует в Float
и Double
. Кроме того, поскольку byte
, short
и char
представлены в int
s во время выполнения, я бы не увидел конкретного варианта использования для этих значений, что могло бы объяснить их отсутствие.
Комментарии:
1.
Float
илиDouble
возникла бы проблема с локализацией системы: в некоторых местах десятичным разделителем является точка.
, а в других — запятая,
. Также проблемой может быть точность.
Ответ №2:
Вы можете создать 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();
Комментарии:
1. На самом деле это не отвечает на вопрос.