2009-02-11 18 views
5

Để truy cập trường x của lớp ngoài A từ lớp bên trong B, tôi nhận ra rằng bạn có thể sử dụng "A.this.x". Nhưng nếu lớp bên ngoài cũng vô danh thì sao? Ví dụ:Truy cập trường ngoài của lớp ẩn danh từ một lớp ẩn danh bên trong

public class Main1 { 
    public static void main(String[] args) { 
     Comparable c1 = new Comparable(){ 
      int x = 3; 
      public int compareTo(Object o) { 
       Comparable c2 = new Comparable(){ 
        int x = 4; 
        public int compareTo(Object o) { 
         return x; // <-- THIS LINE 
        } 
       }; 
       return c2.compareTo(o); 
      } 
     }; 
     System.out.println(c1.compareTo(null)); 
    } 
} 

Khi mã này được chạy, giá trị 4 được in vì đó là giá trị của trường c2 x. Tuy nhiên, tôi muốn thay đổi dòng được đánh dấu "LINE NÀY" để nó trả về x của lớp ngoài (có nghĩa là, trường c1 x, với giá trị 3). Nếu các lớp bên ngoài (có nghĩa là, lớp c1 của) là một tên lớp A, sau đó tôi có thể thay thế

return x; 

với

return A.this.x; 

Nhưng kể từ khi lớp bên ngoài cũng là vô danh, tôi không có một tên để sử dụng.

Câu hỏi: Có cách nào để sửa đổi dòng có nhãn "DÒNG NÀY" để nó đề cập đến trường c1 x thay vì của c2, mà không thay đổi các lớp ẩn danh thành các lớp được đặt tên?

Tôi nhận ra mã này thực sự xấu và không phải là kiểu lập trình tốt để sử dụng các lớp ẩn danh theo cách này, nhưng mã đang được tạo bởi chương trình khác và đây là cách dễ nhất để triển khai trình tạo.

Trả lời

4

Tôi sẽ tránh ẩn biến khác bằng cách chọn tên khác với x.

0

Tôi tin rằng bạn sẽ phải khai báo trường cuối cùng - mã bạn có ở đó chỉ biên dịch vì bóng bạn đang khiếu nại về . Không đúng.

Điều này có vẻ giống như trường hợp cổ điển, giống như số gensym của Lisp sẽ giúp mọi thứ trở nên dễ dàng hơn. Nói cách khác, hãy tạo trình tạo mã sử dụng các số nhận dạng khác nhau cho các biến đó - ví dụ: x1 và x2.

+0

Các trường không cần phải là kết quả cuối cùng; đó chỉ dành cho các tham số/biến cục bộ. Nếu anh ta gọi trường bên ngoài là 'y', anh ta có thể truy cập nó từ lớp bên trong nhất. –

2

Câu trả lời đơn giản là không shadow các biến:

public static void main(String[] args) { 
    Comparable c1 = new Comparable() { 
     int x = 3; 
     public int compareTo(Object o) { 
      Comparable c2 = new Comparable() { 
       //changed this name 
       int y = 4; 
       public int compareTo(Object o) { 
        return x; 
       } 
      }; 
      return c2.compareTo(o); 
     } 
    }; 
    System.out.println(c1.compareTo(null)); 
} 

Output:

Cho rằng bạn đang làm việc với mã được tạo, đây là một lựa chọn cho bạn?

1

AFAIK không có cách nào để đạt được những gì bạn muốn. Nếu bạn có thể thay đổi mã (khi bạn xuất hiện để có thể) nhưng không muốn thay đổi chúng thành các lớp được đặt tên, bạn có thể thay đổi tên của các biến để không có vấn đề phạm vi không? Bạn nên đổi tên cho chúng để rõ ràng anyway

1

Các lớp là vô danh. Không có cách nào để truy cập các trường của họ bằng cách sử dụng tham chiếu tên. Không có tên.