2010-04-14 25 views
19

ví dụ và là này pháp luật:Phương pháp có thể trong java được lồng nhau và hiệu ứng là gì?

class NAME { 
method { 
    method {} 
} 
} 

và điều gì sẽ ảnh hưởng được? có bất kỳ cú pháp đặc biệt nào không?

+2

công cụ không hợp lệ! Tôi đang mạo hiểm bỏ phiếu phủ định: bạn đang tìm kiếm điều gì? chỉ SO phiếu bầu? Câu hỏi này là gì? bạn đang cố gắng đạt được điều gì? –

+4

@EJP, trình biên dịch sẽ chỉ cung cấp cho tôi câu trả lời đúng nếu câu trả lời của trình biên dịch là có. Tôi có thể thử nó và nó không thể làm việc nhưng cú pháp có thể sai, tôi có thể bị lỗi. không có cách nào để biết. – David

+3

Tôi xin lỗi nhưng đó là một sự phân biệt vô nghĩa. Bạn hỏi liệu nó có hợp pháp không. Trình biên dịch trả lời rằng trong tiêu cực hoặc khẳng định. – EJP

Trả lời

38

CẬP NHẬT Vì phương thức Java 8 có thể lồng nhau bằng lambda, xem this other question.

Câu trả lời này có giá trị trong các phiên bản Java trước Java 8

Original câu trả lời sau:

phương pháp trong java có thể được lồng vào nhau [...]?

Không, điều đó là không thể.

Điều gần nhất bạn có thể nhận được là:

class Name { 
    void methodOne() { 
     class InnerClass { 
      void methodTwo() { 
      } 
     } 
    } 
} 

Đó là, một phương pháp thứ hai định nghĩa trong một lớp bên trong định nghĩa trong một phương pháp.

Bạn có thể khai báo phương thức tĩnh bên trong lớp bên trong, vì vậy bạn không phải gọi số new

+0

Bạn phải xóa dấu ngoặc đơn trên khai báo lớp bên trong: 'class InnerClass {' – Mindwin

+2

Có điều này là cũ và đã đóng nhưng vì lợi ích của độc giả, bạn không thể khai báo các thành viên tĩnh trong lớp bên trong vì chúng cần một thể hiện của lớp ngoài. Bạn không thể tránh toán tử mới. – 1der

+0

Java 8 cung cấp một đường cú pháp tốt cho việc này. http://stackoverflow.com/a/28576581/354144 –

12

Đó là cú pháp không hợp lệ; không hỗ trợ tính năng này. (Mặc dù nó đang được xem xét cho Java 7)

Thay vào đó, bạn có thể sử dụng các lớp lồng nhau, mà bạn just asked about.

+0

Các lớp bên trong địa phương cụ thể. –

+0

Java 7 đã hết và không bao gồm các phương thức lồng nhau. Có thể Java 8. – mirelon

+0

Java 8 đã hết và không bao gồm các phương thức lồng nhau. Có thể Java 9. – Oli

2

Nếu không kiểm tra, tôi muốn nói rằng điều này không được trình biên dịch chấp nhận vì vì các phương thức thời gian này cần được định nghĩa trong một lớp. Tuy nhiên, bạn có thể định nghĩa một lớp bên trong bên trong phương thức (xem "Các lớp bên trong địa phương và vô danh").

http://java.sun.com/docs/books/tutorial/java/javaOO/innerclasses.html

4

số

Một giải pháp chỉ là để tuyên bố những phương pháp bạn muốn gọi như phương pháp tư nhân bên ngoài "cha mẹ" method-- nếu bạn đang thực sự làm phiền, bạn có thể sử dụng một số quy ước đặt tên để chỉ ra rằng chúng "thuộc về" phương thức "cha mẹ".

Một điều khác mà bạn có thể xem xét-- và dường như không được nhiều người lập trình biết đến - là bạn có thể khai báo bất kỳ khối phạm vi tùy ý nào và gắn nhãn, sau đó sử dụng ngắt để thoát khỏi khối đó.

Vì vậy, sau đây là Java hoàn toàn hợp pháp:

void method() { 
     myInnerMethod : { 
     // do some stuff 

     if (condition) { 
      break myInnerMethod; 
     } 

     // do some more stuff 
     } 
} 

Tất nhiên, khối phạm vi không phải là thực sự là một phương pháp, nhưng trong một số trường hợp, nó có thể được sử dụng để làm những gì bạn muốn một "bên trong phương pháp cho.

+0

+1, tôi chưa bao giờ biết điều đó, nhưng tôi vừa xác minh nó ...Tôi đoán bạn không thể gọi khối, nhưng như đã chỉ ra ở trên, bạn có thể nhảy đến nó. (Trong thực sự không chắc chắn những gì sử dụng các tính năng này là, TBH.) – Edmund

+0

@ Edmund bạn không thể ** nhảy đến ** dán nhãn khối. Bạn chỉ có thể ** tách ra khỏi ** chúng. Mà làm cho họ bên cạnh vô dụng như phương pháp ersatz. –

+0

@Stephen - cảm ơn sự điều chỉnh. Tôi đã không bao giờ được sử dụng phá vỡ có nhãn và loại giả định họ có nghĩa là "phá vỡ nhãn này" và không "thoát ra khỏi nhãn này". – Edmund

-2

Không được chấp nhận trong Java. Có vẻ như bạn muốn thực hiện đệ quy, chỉ cần gọi lại cùng một phương thức.

method(){ 

    method(); 

} 
+0

Hãy nghĩ rằng chúng có nghĩa là định nghĩa một phương pháp trong một phương thức khác, chứ không phải đệ quy. –

+1

@Neil: Tôi không nghĩ anh ấy hiểu ý anh ấy là gì. ;) Tuy nhiên, bạn có thể đúng. – SLaks

3

No. Cú pháp không hợp lệ. Và đó là một sự xấu hổ - đó là một trong những điều tôi nhớ từ Ada. Không có khả năng xác định các phương thức lồng nhau không tạo ra nhiều vấn đề trong việc tổ chức các lớp với số lượng đáng kể các phương thức riêng. Từ đó nó là một con dốc trơn trượt vào vùng đất thiếu gắn kết.

Bạn có thể sử dụng các lớp lồng nhau, nhưng chúng có giá. Mỗi lớp lồng nhau tạo ra một lớp $ có tên. Mỗi người có một số điện thoại về xử lý tập tin mở (nếu không được kéo từ một kho lưu trữ) cũng như bộ nhớ được thực hiện bởi định nghĩa lớp học của nó. Một số hệ thống có giới hạn về số lượng tệp (do đó tổng số lớp được tạo) mà chúng có thể triển khai (ví dụ: Google Apps.)

Nói cách khác, tôi sẽ không sử dụng các lớp lồng nhau để bắt chước các phương thức lồng nhau (chỉ trong trường hợp bạn Bây giờ, giả định rằng bạn có thể sử dụng các phương thức lồng nhau (như trong Ada), các phương thức đó sẽ chỉ hiển thị trong phương thức kèm theo (chúng sẽ bị giới hạn hơn các phương thức riêng riêng.) Họ sẽ có thể thấy các biến và tham số được xác định trong phạm vi bên ngoài (nhưng có lẽ chỉ khi được xác định là cuối cùng.)

Nó sẽ cho phép bạn tổ chức m của bạn ethods và thuật toán trong không gian tên lồng nhau. Khi được sử dụng một cách thông minh, các phương thức lồng nhau thực sự giúp tổ chức mã của bạn.

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