2014-06-17 20 views
5

Trên Java 1.8, bạn không phải xác định trường là final để được truy cập từ các lớp ẩn danh.Truy cập trường ẩn danh trên khả năng tương thích Java 1.8 với phiên bản cũ

Ví dụ, trên các phiên bản cũ:

public void foo(final int bar) { 
    new Runnable() { 
    public void run() { 
     System.out.println(bar); 
    } 
    }; 
} 

Nhưng, bây giờ, trên Java 1.8, bar không cần phải thức:

public void foo(int bar) { 
    new Runnable() { 
    public void run() { 
     System.out.println(bar); 
    } 
    }; 
} 

Vì vậy, nếu tôi lập dự án của tôi, và tài nguyên duy nhất được thực hiện trên Java 1.8 Tôi đang sử dụng là điều này (tôi không sử dụng bất kỳ lambdas, các lớp mới, vv), mã của tôi có thể thực thi được trên các máy tính có các phiên bản Java cũ hơn không? Nếu không, tại sao?

+3

Bạn có thể bỏ lỡ này [Sự khác nhau giữa thức và hiệu quả chính thức] (http://stackoverflow.com/questions/20938095/difference-between-final-and-effectively-final) –

+2

'javac' chỉ đơn giản là không cho phép bạn kết hợp' -source 1.8' với '-target 1.7'. – Holger

+0

Tắt tiếp tuyến, nhưng tôi không muốn viết mã 1.8 mà không khai báo rõ ràng các biến hoặc biến cuối cùng của tôi dưới dạng * final *. Không giống như các ngôn ngữ khác nơi mà args và vars có hiệu quả bất biến theo mặc định, Java, ngôn ngữ, đã luôn làm cho chúng có thể thay đổi, theo mặc định. Vì vậy, bây giờ, Java 1.8 đang làm điều kỳ diệu đằng sau hậu trường làm mờ hiệu quả dòng của những gì có thể thay đổi và những gì không. Ý tưởng khủng khiếp khi nói đến khả năng đọc mã. –

Trả lời

6

Khi biên dịch với -target 1.8, javac sẽ phát ra các tệp lớp với số phiên bản 52.0 không được các JVM trước đó hỗ trợ. Vì vậy, ngay cả khi đó là khác biệt duy nhất nó ngăn bạn thực hiện các tệp được biên dịch với -target 1.8.

javac không hỗ trợ chỉ định -source 1.8-target 1.7 cùng một lúc. Nó sẽ tạo ra thông báo lỗi source release 1.8 requires target release 1.8. Nhưng thực tế, nếu sử dụng các biến cuối cùng hiệu quả là tính năng Java 8 duy nhất bạn đang sử dụng, không có sự khác biệt mã byte bên cạnh số phiên bản. Nếu bạn biên dịch mã như vậy nhắm mục tiêu 1.8 và vá các tệp lớp giảm số phiên bản thành 51.0, chúng sẽ chạy trên Java 7. Nó đơn giản như việc giảm byte tại chỉ mục 7 một.

Phần khôn lanh là để rèn luyện bản thân để không sử dụng các tính năng khác Java 8 khi sử dụng một trình biên dịch Java 8 nếu bạn muốn tạo Java 7 mã tương thích ...

1

Tôi nghĩ Java 8 đã thay đổi phiên bản chính của tệp lớp thành khác với Java 7 để một JVM cũ hơn có thể sẽ không thể tải các lớp mới hơn.

Nếu bạn lập với một -target 1.7 Tôi không biết nếu bạn có thể sử dụng hiệu quả thức

0

Nếu bạn lập mã không -target 1.7 -source 1.7 nó sẽ được biên dịch để phiên bản bytecode mới hơn và cũ JVM không thể chạy như vậy các lớp học.

Nếu bạn biên dịch ví dụ của bạn với -target 1.7 -source 1.7 tùy chọn - biến chứng sẽ thất bại với thông điệp

error: local variable bar is accessed from within inner class; needs to be declared final 
           System.out.println(bar); 
               ^

như vậy, câu trả lời là KHÔNG, bạn không thể chạy mã này trên cũ JVM của

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