2009-07-20 28 views
9

Tôi có một mảng Java:giải pháp Java cho C++ phong cách chỉ thị

String[] myArray = {"1", "2"}; 

Tùy thuộc vào một điều kiện được biết đến tại thời gian biên dịch Tôi muốn gán giá trị khác nhau:

String[] myArray = {"A", "B", "C"}; 

Trong C++ Tôi sẽ sử dụng một cái gì đó như

#ifdef ABC 
    // ABC stuff here 
#else 
    // 123 stuff here 
#endif 

nhưng phải làm gì trong Java?

+1

Không chắc chắn, nhưng tôi nghĩ bạn có thể chuyển những thứ đó cho jvm bằng cách sử dụng '-Dname = value' và sau đó sử dụng' System.getProperty' để nhận giá trị 'name'. –

+0

p.s. Chào mừng bạn đến với SO! – jjnguy

Trả lời

13
class Foo { 

    static final boolean ABC = true; 

    public void someMehod() { 
     if (ABC) { // #ifdef ABC 

     } else { // #else 

     }   // #endif 
    } 
} 

vì ABC vừa là tĩnh và cuối cùng trình biên dịch đánh giá nó lúc biên dịch, hoạt động hiệu quả giống như bộ xử lý trước.

+4

Sử dụng ý tưởng của libt từ các nhận xét. sử dụng System.getProperty ("...") để gán ABC. –

1
String[] myArray; 

if (ABC) 
myArray = ... 
else 
myArray = ... 

ABC là biến cuối cùng tĩnh, JVM bắt buộc phải kiểm tra điều kiện nội tuyến.

3

Trong Java, bạn sẽ cần thực hiện điều đó khi chạy.

String[] myArray; 
if (something) 
    myArray = new String[]{"A", "B"}; 
else 
    myArray = new String[]{"A", "B, "C"} 

Điều này sẽ giống nhất với mã C++. Và, nếu điều kiện của bạn được đảm bảo là đúng lúc biên dịch, Java sẽ tối ưu hóa cuộc gọi.

Có các tùy chọn khác có sẵn, nhưng chúng sẽ không giống như phiên bản C++.

+0

Cảm ơn, điều này chắc chắn sẽ làm việc - trình biên dịch sẽ tối ưu hóa phần khác nếu "cái gì" luôn đúng? –

+1

Thực tế là có. Nếu bạn có cái gì đó để nó luôn luôn đúng, nó sẽ tối ưu hóa 'if.' – jjnguy

+0

(Và nhiều hơn nữa được diễn đạt rõ ràng hơn so với phiên bản của stepancheg) –

1

Một cách tiếp cận là tạo lại tệp Constants.java trong giai đoạn đầu của tập lệnh xây dựng (kiến, maven hoặc bất kỳ thứ gì khác bạn sử dụng). Tùy thuộc vào cách phức tạp mà tập tin là bạn có thể làm điều đó bằng tay hoặc sử dụng một cái gì đó nặng hơn như Velocity.

Tôi đã sử dụng một cái gì đó tương tự trong quá khứ để đặt phiên bản và xây dựng thông tin bên trong các lớp học java.

1

Sử dụng công cụ mẫu (giống như Vận tốc) để thực thi bước tiền xử lý. Kịch bản xây dựng của bạn có thể chạy mẫu áp dụng các thuộc tính từ môi trường xây dựng để xuất mã nguồn Java được biên dịch cuối cùng. Về cơ bản, đây là những gì mà các bộ tiền xử lý C/C++ thực hiện.

Tôi đoán là ai đó đã mã hóa tác vụ kiến ​​để thực hiện việc này, nhưng tôi quá lười biếng với Google đối với bạn.

1

Nếu bạn sử dụng một var/const làm chỉ thị trình biên dịch tùy chỉnh trong Java thì không làm cho nó cuối cùng. Bạn có thể nhận được rất nhiều cảnh báo vì điều kiện là "luôn luôn đúng" và các công cụ.

public static boolean ABC = true; // or false 
+1

Điểm công bằng về cảnh báo, nhưng nếu bạn không có biến đó là cuối cùng thì trình biên dịch không thể tối ưu hóa khối if/else. – sharakan

0

Bạn không thể thực sự ... cách tốt nhất là sử dụng công cụ mẫu ... thậm chí một số trình biên dịch sẽ đưa mã vào tệp lớp cuối - những trình tốt hơn sẽ xóa mã nếu nó không được yêu cầu ... Bạn phải tạo các hằng số cuối cùng và bạn cũng phải đặt chúng thành một giá trị tuyệt đối cho trình biên dịch để có thể loại bỏ mã.

public static final boolean ABC = true // This will be enough for the compiler to remove code 

public static final boolean ABC = [any method call] // This is not enough to work and will leave the code in there 

Một lần nữa, một số trình biên dịch vẫn có thể đặt mã trong đó mặc dù nó là unreachable (có nghĩa là lý do tại sao một số IDE sẽ cảnh báo bạn rằng mã là unreachable để bạn loại bỏ các mã mà không cần thiết)

Tuy nhiên,

Chỉ thị khó chịu và rất có thể bạn cần phải sử dụng triển khai giao diện thay vì chỉ thị! tốt cho mã hóa cấp thấp khi cần thiết (để giảm thiểu bộ nhớ chân in) - một số thiết bị đặc biệt như các nhà sản xuất tốc độ và tương tự nhưng tại sao bạn muốn sử dụng chúng trong java?

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