2012-04-13 9 views
9

"Tại sao bạn làm điều này có vấn đề gì với bạn?" Tuy nhiên, có cách nào để thực hiện điều này mà không thay đổi tên tham số phương thức cuối cùng?Các thông số cuối cùng có thể đủ điều kiện theo một cách nào đó để giải quyết xung đột đặt tên với các thành viên lớp ẩn danh không?

private Foo createAnonymousFoo(final Bar bar) { 
    return new Foo() { 
     private Bar bar = SomeUnknownScopeQualifier.bar; 

     public Bar getBar() { 
      return bar; 
     } 

     public void doSomethingThatReassignsBar() { 
      bar = bar.createSomeDerivedInstanceOfBar(); 
     } 
    }; 
} 

Rõ ràng là không có doSomethingThatReassignsBar gọi, bạn sẽ không cần thanh thành viên, v.v. Trong trường hợp này, sửa chữa đơn giản là thay đổi final Bar bar thành một cái gì đó như final Bar startBar và sau đó nhiệm vụ là tốt. Nhưng ngoài sự tò mò, có thể tham khảo cụ thể đến số final Bar (Tương tự như cách bạn nói Super.this)?

+6

"Tại sao bạn làm điều này có vấn đề gì với bạn?" :) – jpm

+0

Nó thực sự không đáng trách như bạn tưởng tượng. Tôi đã tạo trình tạo tài liệu và sử dụng mẫu khách truy cập để viết các mục và trong trường hợp bảng tính, tôi chỉ đơn giản lặp qua các ô bắt đầu tại "startCell" (tham số phương thức cuối cùng) và di chuyển qua chúng bằng 'cell = cell.nextCell() ', trong đó ô là ô hiện tại của ItemVisitor để ghi vào. –

Trả lời

7

Tôi nghĩ câu trả lời cho câu hỏi của bạn là "không". Từ Java Language Specification:

Một biến cục bộ (§14.4), tham số (§8.4.1) chính thức, tham số ngoại lệ (§14.20), và lớp địa phương (§14.3) chỉ có thể được gọi bằng một tên đơn giản (§6.2), không phải là tên đủ điều kiện (§6.6).

Nói cách khác, không có gì bạn có thể thay thế SomeUnknownScopeQualifier bằng mã ví dụ để thực hiện câu lệnh gán trong lớp bên trong tham chiếu đến tên thông số chính thức.

3

Tôi nghĩ rằng không thể thực hiện điều đó. Đổi tên các biến liên quan hoặc tạo bí danh:

private Foo createAnonymousFoo(final Bar bar) { 
    final Bar alias = bar; 
    return new Foo() { 
    private Bar bar = alias; 

    // ... 
    }; 
} 
+0

Điều này có vẻ không khác với chỉ đặt tên tham số phương thức 'alias'? –

+2

Tên thông số phương thức có thể có sẵn cho các công cụ hoàn thành mã hoặc tương tự. Do đó, tốt hơn là nên có tên tự ghi trong API công khai và sử dụng tên riêng biệt (mặc dù có thể khó hiểu) trong nội bộ. – jpm

+0

Đó là một điểm tuyệt vời. Tôi đã upvoted này vì nó là một câu trả lời hữu ích và sâu sắc. Câu trả lời từ Alex, tuy nhiên, trích dẫn JLS và tôi cảm thấy tôi nên chấp nhận điều đó. –