2013-03-06 40 views
5

Không chắc chắn liệu tôi có đang viết đúng cách không. Vui lòng cho tôi biết nếu bạn cần thêm thông tin. Chúng ta có một yêu cầu mà chúng ta cần xác định loại biến dựa trên biến môi trường hệ thống.Loại biến số nguyên thủy trong thời gian biên dịch

Vì vậy, chúng ta có một lớp sau

class Test 
{ 
    DUMMY_TYPE testVariable; 
} 

Các DUMMY_TYPE được xác định dựa trên một biến hệ thống. Vì vậy, khi Java biên dịch, Java có thể sử dụng biến môi trường hệ thống để xác định loại ở dạng biên dịch không? Ngoài ra, có thể thiết lập điều này bằng cách nào đó trên Eclipse, nơi Eclipse sẽ tiếp tục hiển thị cho tôi DUMMY_TYPE trên IDE ở bất cứ nơi nào tôi sử dụng, nhưng khi biên dịch và xây dựng nó có thể thay thế DUMMY_TYPE bằng đúng loại dựa trên biến môi trường ?

+0

mát câu hỏi. Vì lợi ích của sự tò mò, bạn có nhớ tôi hỏi trường hợp sử dụng cho điều này là gì không? – asteri

+7

Câu trả lời của Nutshell là không, nhưng không biết bạn đang cố gắng làm gì, thật khó để biết nếu có một giải pháp thay thế hợp lý. –

+0

Đây là một phần của một API được sử dụng trong nội bộ và tương tác với một hệ thống độc quyền thông qua các ổ cắm. Hệ thống nội bộ có thể truyền một số nguyên hoặc gấp đôi cho cùng một biến. Nó xác định điều đó bằng cách sử dụng biến môi trường. Vì vậy, thay vì duy trì cơ sở mã riêng biệt, tại thời gian biên dịch, nếu chúng ta có thể xác định điều này, sẽ tiết kiệm rất nhiều đau đầu :). Chúng tôi đã có thể đạt được điều này trong C++ và C#, nhưng Java đã cho chúng ta một số đau buồn. – Karthik

Trả lời

1

Tôi có một ý tưởng.

Làm cho testVariable loại Object (hoặc một lớp DummyType kéo dài Object). Sau đó, bạn có thể tải biến với bất kỳ dữ liệu nào bạn muốn bằng cách sử dụng các lớp trình bao bọc nguyên thủy, dựa trên những gì bạn đọc từ biến hệ thống của bạn.

Vì vậy:

public class Test { 

    Object testVariable; 

    { 
     String whichType = null; 

     //Logic to read your system variable from wherever and store it in whichType 

     if(whichType.equals("int")) { 
      testVariable = new Integer(intVal); 
     } 
     else if(whichType.equals("double")) { 
      testVariable = new Double(doubleVal); 
     } 
     //etc. 
    } 

Tất nhiên, đây không phải là Java "tìm ra", mà nó là loại tại thời gian biên dịch như bạn muốn, nhất thiết (và việc chuyển nhượng sẽ diễn ra vào thời gian chạy, khi Test đối tượng đã được tạo), nhưng nó có vẻ như khung hợp lý cho một thay thế.

Và bạn cũng có thể đặt giá trị của testVariable khi khởi tạo khi thích hợp, một cách tự nhiên.

Ngoài ra, bạn có thể có một phương pháp như thế này mà chấp nhận đầu vào như một String (đọc từ biến hệ thống của bạn) và trả về nó trong lớp wrapper thích hợp của các loại nguyên thủy:

public Object getPrimitiveValue(String type, String value) { 
    if(type.equals("int")) { 
     return new Integer(Integer.parseInt(value)); 
    } 
    else if(type.equals("double")) { 
     return new Double(Double.parseDouble(value)); 
    } 
    //etc. 
} 
+0

Điều này có vẻ giống như một xấp xỉ hợp lý cho những gì đang được hỏi. Ngoài ra, vì kiểu là 'Integer' hoặc' Double', siêu lớp có thể là 'Số', thay vì' Object'. –

+0

Jeff, chúng tôi đã nghĩ về điều này. Tuy nhiên, các thư viện mà chúng tôi sử dụng trong API sử dụng phiên bản nguyên thủy của các biến. Do đó chúng tôi không thể làm điều này cho ứng dụng. Mông Tôi đồng ý với Nathaniel rằng đây chắc chắn là một giải pháp khả thi, không có các hạn chế khác của chúng tôi. Cảm ơn. – Karthik

+0

@ user1524088 Thực tế là họ chấp nhận các phiên bản nguyên thủy không phải là một vấn đề, do tự động unboxing hoặc gọi một cách rõ ràng phương thức 'intValue()' của một 'Integer' (và tương tự cho tất cả các lớp wrapper). – asteri

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