2013-08-30 65 views
5
public class Application { 
    public static void main(String[] args) { 
     final class Constants { 
      public static String name = "globe"; 
     } 
     Thread thread = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       System.out.println(Constants.name); 
      } 
     }); 
     thread.start(); 
    } 
} 

Compilation Lỗi: The field name cannot be declared static in a non-static inner type, unless initialized with a constant expressionLỗi: tên trường không thể được khai báo tĩnh

Giải pháp cho điều này?

+0

Bạn đã cố gắng tạo 'Constants' là một kiểu tĩnh? –

+0

Không khai báo chuỗi trong hằng số hoặc tạo lớp cuối cùng Hằng số cũng tĩnh (và có thể không khai báo nó bên trong phương thức chính). – Matthias

Trả lời

8

Java không cho phép bạn xác định các trường tĩnh không phải là cuối cùng bên trong các lớp bên trong hàm địa phương. Chỉ các lớp cấp cao nhất và các lớp lồng nhau tĩnh mới được phép có các trường tĩnh không phải là cuối cùng.

Nếu bạn muốn có một lĩnh vực static trong lớp Constants của bạn, đặt nó ở cấp Application lớp, như thế này:

public class Application { 
    static final class Constants { 
     public static String name = "globe"; 
    } 
    public static void main(String[] args) { 
     Thread thread = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       System.out.println(Constants.name); 
      } 
     }); 
     thread.start(); 
    } 
} 
+2

Câu đầu tiên của bạn không chính xác - nếu trường được tạo thành 'final' bên trong mã gốc, nó sẽ biên dịch, vì nó được khởi tạo với một giá trị không đổi. –

+0

Bây giờ biến 'name' sẽ được khai báo' final' –

+1

@ micro.pravi: Nếu bạn làm cho nó 'final', bạn có thể tạo' Constants' một lớp địa phương một lần nữa .. –

6

Từ JLS section 8.1.3:

Inner classes may not declare static members, unless they are constant variables (§4.12.4), or a compile-time error occurs.

Vì vậy, bạn đang sử dụng tốt nếu bạn chỉ cần tạo biến số final:

public class Application { 
    public static void main(String[] args) { 
     final class Constants { 
      public static final String name = "globe"; 
     } 
     Thread thread = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       System.out.println(Constants.name); 
      } 
     }); 
     thread.start(); 
    } 
} 

Tất nhiên điều này sẽ không hoạt động nếu bạn cần khởi tạo nó với một giá trị không đổi.

Có nói tất cả điều này, đó là một thiết kế khác thường, IMO. Rất hiếm khi thấy một lớp học địa phương được đặt tên, theo kinh nghiệm của tôi. Bạn có cần đây là lớp địa phương không? Bạn đang cố gắng đạt được điều gì?