【问题标题】:Which Java classes can get and cast system properties, and why?哪些 Java 类可以获取和转换系统属性,为什么?
【发布时间】:2014-08-24 18:43:06
【问题描述】:

使用-Dkey=value 设置的任何系统属性都可以使用System.getProperty("key") 作为字符串检索。但是您也可以将某些系统属性转换为特定类型,例如:

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) 方法的类?为什么ByteFloatDouble 没有它们,而其他原始包装器却有(或者可能是什么原因)?

【问题讨论】:

  • 我一直想知道为什么 Boolean、Integer 和 Long 有这些方法,因为它们与关联类的功能并不真正相关。我怀疑它们是历史上的意外,如果从头开始就不会提供。它们确实属于 System 或某些单独的 Properties 类。
  • @HotLicks 正是我的想法。这些方法附加到了错误的类,并且被误导了。

标签: java system-properties


【解决方案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 result;
}

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

如果给定值是非法的,上述方法只是为了方便检索类型属性或默认值。

据我所知,只有包装器类型 BooleanLongInteger 提供此类方法。 (String 类型确实是 not offer such a method,而不是您的问题所暗示的。)原因可能是这些原始类型对于作为系统属性移交的属性很常见。例如,您通常不需要用户通过命令行提供 XML 结构,仅举一个例子。

读取系统属性是遍及整个 Java 类库的要求。可以将一组类似的便利方法放入内部包中,但我猜 JDK 库的作者认为这是与 JCL 之外的用户相关的要求并将其公开。最后,包装类型旨在为处理原语提供一些便利。我不知道有比包装器类型更好的地方来放置这些方法。

正如 Pablo 所指出的,十进制值不被视为命令行属性的好值,因为它取决于区域设置的小数分隔符。另外,我想不出 JCL 中使用了这样的属性。这可以解释为什么FloatDouble 缺少类似的方法。此外,因为byteshortchar 在运行时以ints 表示,所以我看不到这些值的特定用例,也无法解释它们的缺失。

【讨论】:

  • FloatDouble 会与系统的区域设置有问题:在某些地方小数分隔符是点 .,而在其他地方是逗号 ,。精度也可能是个问题。
【解决方案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();

【讨论】:

  • 这实际上并不能回答问题。
猜你喜欢
  • 2013-12-22
  • 1970-01-01
  • 1970-01-01
  • 2010-11-17
  • 2011-11-14
  • 1970-01-01
  • 1970-01-01
  • 2011-08-13
  • 2013-06-24
相关资源
最近更新 更多