2010-07-14 20 views
21

Tôi chỉ phát hiện local class trong Java:Khi nào bạn nên sử dụng một lớp địa phương trong Java?

public final class LocalClassTest 
{ 
    public static void main(final String[] args) { 
    for(int i = 10; i > 0; i--) { 
     // Local class definition--declaring a new class local to the for-loop 
     class DecrementingCounter { 
     private int m_countFrom; 

     public DecrementingCounter(final int p_countFrom) { 
      m_countFrom = p_countFrom; 
     } 

     public void count() { 
      for (int c = m_countFrom; c > 0; c--) { 
      System.out.print(c + " "); 
      } 
      System.out.println(); 
     } 
     } 

     // Use the local class 
     DecrementingCounter dc = new DecrementingCounter(i); 
     dc.count(); 
    } 
    } 
} 

tôi đã đi qua nhận xét này: Advantages of Local Classes đó liệt kê một số lợi thế rất lớn của các tầng lớp địa phương qua các lớp bên trong vô danh.

Câu hỏi của tôi là, có vẻ như sẽ không có nhiều trường hợp kỹ thuật này có lợi thế hơn các lớp bên trong vô danh. Ý tôi là: bạn sẽ sử dụng một lớp địa phương nếu lớp của bạn chỉ hữu dụng bên trong phạm vi của phương thức. Nhưng khi các phương thức của bạn đến mức chúng phức tạp đến nỗi bạn cần phải bắt đầu định nghĩa các lớp tùy chỉnh bên trong chúng, chúng có lẽ đã quá phức tạp rồi, và cần phải tách ra. Tại thời điểm đó, lớp học địa phương của bạn sẽ phải trở thành một lớp bên trong, phải không?

Một số ví dụ về thời điểm các lớp địa phương mong muốn hơn các lớp bên trong, không liên quan đến các phương pháp siêu phức tạp (nên tránh)?

+6

AAHHHHH ... mắt tôi bị đau. :) – limc

+9

lớp địa phương được khai báo trong vòng lặp ???? bạn điên à? Bạn không cần phải làm điều đó vì lớp của bạn không truy cập bất kỳ biến địa phương nào của vòng lặp. Lớp này thậm chí có thể được bên ngoài dễ dàng –

+5

@eugener: Vâng, tôi cho rằng nó nên được khai báo bên ngoài vòng lặp, nhưng đó là một ví dụ contrived mà có vẻ như vô lý bằng nhau theo cách ... –

Trả lời

8

Lớp địa phương là thứ được sử dụng trong một số phương pháp cụ thể và không nơi nào khác.

Để tôi cung cấp một ví dụ, tôi đã sử dụng lớp địa phương trong bộ giải mã/mã hóa JPEG của tôi, khi tôi đọc cấu hình từ tệp sẽ xác định quá trình giải mã tiếp theo. Nó trông giống như sau:

class DecodeConfig { 
    int compId; 
    int dcTableId; 
    int acTableId; 
} 

Về cơ bản, chỉ có ba int được nhóm lại với nhau. Tôi cần một loạt các cấu hình, đó là lý do tại sao tôi không thể chỉ sử dụng một lớp ẩn danh. Nếu tôi đã được mã hóa trong C, tôi đã sử dụng một cấu trúc.

Tôi có thể làm điều này với một lớp bên trong, nhưng tất cả quá trình giải mã được xử lý trong một phương thức duy nhất và tôi không cần phải sử dụng cấu hình ở bất kỳ nơi nào khác. Đó là lý do tại sao một lớp học địa phương sẽ là đủ.

Đây là một ví dụ cơ bản nhất, nhưng nó là từ cuộc sống thực.

+0

Tôi chắc chắn bạn có lý do cho cách tiếp cận này, nhưng nếu bạn chỉ chụp cho cấu trúc của C, thì sẽ không sử dụng Enum là giải pháp thích hợp hơn? – limc

+0

Enum sẽ không thực hiện thủ thuật, tôi đọc tất cả các giá trị từ tệp và chúng không tạo thành một bộ giá trị được xác định trước. Ngoài ra tôi cần phải nhóm ba thông số khác nhau và tôi không chắc làm thế nào enums có thể giúp tôi làm điều đó. – Malcolm

+0

Tại sao bạn lại chọn làm "cấu trúc" một lớp địa phương thay vì một lớp bên trong riêng tư? Nó chỉ được sử dụng bên trong một phương pháp duy nhất? Bạn nói phương pháp này phức tạp như thế nào? –

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