2011-12-27 43 views
5

Tôi có một lớp đơn.Truy cập các trường đơn lẻ qua phương thức tĩnh

Khi truy cập các phương thức của lớp, tôi có thể chọn hai khả năng.

  1. Tạo các phương pháp đó như ví dụ cụ thể và sau đó nhận được những ví dụ và gọi họ
  2. Tạo các phương pháp đó như tĩnh và gọi họ và họ sẽ nhận được dụ

Ví dụ:

Class Test{ 

private int field1; 

Test instance; 

private Test(){}; 

private Test getInstance(){ 
    if (instance == null) 
     instance = new Test(); 
    return instance; 
} 

public int method1() { return field1;} 
public static int method2() {return getInstance().field1;} 
} 

Hiện tại, ở nơi khác tôi có thể viết

int x = Test.getInstance().method1(); 
int y = Test.method2(); 

Điều nào tốt hơn? Tôi có thể nghĩ đến giải pháp thay thế thứ 3 nơi tôi sử dụng "cá thể" trực tiếp trong phương thức tĩnh và sau đó chụp ngoại lệ nếu nó là rỗng và khởi tạo nó và sau đó gọi lại chính nó.

Tôi có thể, về lý thuyết, chỉ làm cho toàn bộ quá trình tĩnh. Tuy nhiên, điều này sẽ tạo ra cho tôi các vấn đề khi lưu trạng thái ở gần hoạt động vì việc tuần tự hóa không lưu tĩnh.

+0

Tôi sẽ đi với 'Test.method2();' vì nó chuyển tải thực tế là 'method2()' là một phương thức tĩnh. – TheVillageIdiot

Trả lời

2

Tôi nghĩ cái đầu tiên sạch hơn.

Tuy nhiên, hãy nhớ rằng trong một số trường hợp cực đoan, Android có thể giết các phiên bản tĩnh của bạn. Xem ví dụ này: http://code.google.com/p/acra/.

Một giải pháp thay thế mà tôi đã tìm thấy ở đâu đó cho điều này, là để giữ tham chiếu đến singleton của bạn từ lớp Ứng dụng, là tốt. Tuy nhiên, tôi không biết vấn đề này là vấn đề.

+0

Khi bạn nói "giết" tôi giả sử bạn đang nói về hoạt động đang bị đóng. – theblitz

+1

Không, tôi đang nói về các cá thể tĩnh đang bị hủy. Bạn không nên ngạc nhiên khi các hoạt động chết, bạn sẽ rất ngạc nhiên khi các cá thể tĩnh chết - nó không xảy ra trong Java. – zmbq

2

Bạn nên tránh làm mọi thứ tĩnh. Một số người thậm chí sẽ nói rằng một singleton không được thực hiện.

+0

Phải là một singleton vì tôi cần nó từ một tải toàn bộ các địa điểm và phải giống nhau. – theblitz

+0

Sau đó, bạn nên đi với "int x = Test.getInstance(). Method1();" giải pháp, vì field1 không tĩnh chút nào. – ChristopherS

0

Theo ý kiến ​​cá nhân của tôi, các phương pháp tĩnh có thiết kế kém ngay từ đầu. Nó, tất nhiên, phụ thuộc vào chính chương trình, nhưng cho phép một lớp có phương pháp tĩnh sẽ có tác động đến toàn bộ thiết kế. Một số lý do đằng sau tuyên bố của tôi:

  1. Nếu phương pháp tĩnh có thể dễ dàng thay đổi trạng thái của một số đối tượng, sớm hay lỗi sau sẽ xuất hiện
  2. Nếu bạn xuất bản phương pháp tĩnh với chương trình của bạn, mỗi khách hàng sẽ sử dụng nó sẽ có một rất phụ thuộc vào mã của bạn. Nếu bạn quyết định loại bỏ hoặc thay đổi phương thức này vào một ngày nào đó - bạn sẽ phá vỡ mọi ứng dụng khách đã sử dụng lớp của bạn.

Vì vậy, nếu bạn có thể - tránh nó.

Nếu, vì lý do nào đó, bạn sẽ nhấn mạnh vào phương pháp tĩnh, tôi đoán giải pháp đầu tiên là tốt hơn. Đó là cách singleton nên hoạt động. Bạn nên lấy một tham chiếu đến một đối tượng SINGLETON OBJECT thông qua phương pháp tĩnh, nhưng đối tượng này phải là sau đó được sử dụng theo tất cả các nguyên tắc từ Lập trình hướng đối tượng.

+0

(1) Tất nhiên các phương pháp tĩnh chỉ nên được sử dụng cho các hoạt động không thay đổi trạng thái của các đối tượng, nhưng đó không phải là một lý do để cấm hoàn toàn các phương thức tĩnh. (2) Đây là một lời chỉ trích của tất cả các phương pháp công cộng, không chỉ là phương pháp tĩnh. Có một giới hạn cho đến mức bạn có thể tách rời hai lớp mà không mất tương tác hoàn toàn! –

2

Toàn bộ điểm của mẫu đơn là bạn có thể thay đổi triển khai . Trong hầu hết các trường hợp, bạn sử dụng nó để giữ cho khả năng mở "móc" trong một số triển khai khác của chức năng này sau này.

Đọc: khi quyết định ủng hộ kế hoạch singleton cho phương thức setInstance, không chỉ cho số getInstance. - Nếu điều này không có ý nghĩa, chỉ cần sử dụng một lớp tĩnh đơn giản.

Mặt khác, các đĩa đơn đã hết mùa, nếu bạn muốn trở thành hip và tất cả những thứ đó. Thực hiện tìm kiếm "loại bỏ trạng thái toàn cầu". Có một số cuộc hội đàm do Google tài trợ về nó. Tóm lại: mã của bạn sẽ dễ kiểm tra hơn và giúp bạn tránh được một số sự hỗn loạn phụ thuộc. (Bên cạnh hông và tất cả, nó chắc chắn là một bước đi đúng hướng).

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