2014-07-03 14 views
5

Bất kỳ thuộc tính hệ thống nào được đặt bằng -Dkey=value đều có thể được truy xuất dưới dạng Chuỗi sử dụng System.getProperty("key"). Nhưng bạn cũng có thể nhận được một số thuộc tính hệ thống nhất định được gán cho một loại cụ thể, ví dụ:Những lớp Java nào có thể lấy và đúc các thuộc tính hệ thống, và tại sao?

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 

Có bất kỳ lớp nào khác có phương pháp static getSomeClass(String systemPropertyKey) không? Tại sao không Byte, Float hoặc Double có chúng, nhưng các trình đóng gói nguyên thủy khác thực hiện (hoặc những gì có thể là lý do)?

+2

Tôi luôn tự hỏi tại sao Boolean, Integer và Long có các phương thức đó, vì chúng không thực sự liên quan đến chức năng của các lớp liên quan của chúng. Tôi nghi ngờ họ là tai nạn của lịch sử và sẽ không được cung cấp nếu nó đã được thực hiện trên tất cả từ đầu. Chúng thực sự thuộc về System hoặc trong một số thuộc tính riêng biệt. –

+1

@HotLicks Chính xác suy nghĩ của tôi. Những phương pháp đó được gắn vào các lớp sai, và được đặt tên sai lạc. –

Trả lời

7

Nếu bạn nhìn vào việc thực hiện các ví dụ Boolean::getBoolean bạn sẽ thấy rằng các loại wrapper đơn giản là cung cấp một số tiện cho việc đọc 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")); 
} 

Các phương pháp trên chỉ là một thuận tiện để lấy một tài sản đánh máy hoặc một giá trị mặc định nếu giá trị đã cho là bất hợp pháp.

Theo kiến ​​thức của tôi, chỉ có các loại trình bao bọc Boolean, LongInteger cung cấp các phương pháp như vậy. (Loại String chẳng hạn như not offer such a method, khác với câu hỏi của bạn. ') Lý trí có lẽ là một thực tế rằng các kiểu nguyên thủy này là phổ biến cho các thuộc tính được bàn giao như một thuộc tính hệ thống. Ví dụ, bạn sẽ không yêu cầu người dùng cung cấp một cấu trúc XML bằng dòng lệnh, chỉ để đặt tên cho một ví dụ.

Đọc thuộc tính hệ thống là yêu cầu được lan truyền trên toàn bộ thư viện lớp Java. Người ta có thể đặt một tập hợp các phương thức tiện lợi tương tự vào một gói nội bộ nhưng tôi đoán rằng các tác giả của các thư viện JDK coi đây là một yêu cầu cũng có liên quan đến người dùng bên ngoài JCL và công khai nó. Cuối cùng, các loại trình bao bọc có nghĩa là cung cấp một số tiện lợi để xử lý các nguyên thủy. Tôi sẽ không biết một nơi tốt hơn so với các loại wrapper để đưa những phương pháp này.

Như được chỉ ra bởi Pablo, giá trị thập phân không được coi là một giá trị tốt cho thuộc tính dòng lệnh làm dấu tách thập phân, nó phụ thuộc vào ngôn ngữ. Ngoài ra, tôi không thể nghĩ về một tài sản như vậy được sử dụng trong JCL. Điều này giải thích tại sao phương thức tương tự bị thiếu trong số FloatDouble. Ngoài ra, vì byte, shortchar được đại diện tại int khi chạy, tôi sẽ không thấy trường hợp sử dụng cụ thể cho các giá trị này hoặc điều gì sẽ giải thích sự vắng mặt của chúng.

+0

'Float' hoặc' Double' sẽ gặp sự cố với Locale của hệ thống: ở một số vị trí dấu tách thập phân là dấu chấm '.' và trong một số khác là dấu phẩy', '. Độ chính xác cũng có thể là một vấn đề. –

-3

Bạn có thể tạo BigDecimal và thực hiện chuyển đổi từ đó.

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

Điều này không thực sự trả lời câu hỏi. –

Các vấn đề liên quan