2011-02-01 9 views
5

Trong Java, không có quyền truy cập toàn cục như trong C++. Vì vậy, những gì sẽ làm gì nếu họ muốn tạo ra một container của các đối tượng có thể được truy cập từ bất kỳ lớp học? Hoặc nói một bean java chứa các giá trị toàn cục.Truy cập toàn cầu trong Java

Ví dụ: nếu tôi đang tạo mô phỏng thang máy, các trường cần được mọi người biết đến như int numElevators phải được đặt ở đâu đó đúng? Tương tự với đối tượng bộ sưu tập cho thang máy Elevators[] elevators.

Tôi có thể nghĩ ra một cách để tạo một lớp đơn để lưu trữ tất cả các biến toàn cầu đó. Sau đó sử dụng các phương thức tĩnh để cung cấp quyền truy cập từ bất kỳ lớp nào. Nhưng có một giải pháp thanh lịch hơn?

+4

Thông thường, một giải pháp khá thanh lịch không phải là để sử dụng globals hoặc những thứ tương đương;) – delnan

+1

lẽ thang máy đang ở trong một tòa nhà? Một lớp xây dựng sẽ có ý nghĩa. – diagonalbatman

Trả lời

4

Tôi mong đợi một phiên bản của Building để có bộ sưu tập là Elevators. Tôi nghĩ rằng có rất ít điều trong một dự án thực sự toàn cầu và bạn thường có thể tìm thấy một số thực thể quản lý cần chứa và phân phối kiến ​​thức này.

Bằng cách buộc điều này trong thực thể như vậy, bạn có thể a) kiểm soát quyền truy cập và thay đổi/refactor dễ dàng hơn b) giả lập điều này và làm cho thử nghiệm dễ dàng hơn.

+0

Điều này hoàn toàn đúng cách.99% thời gian điều bạn muốn sử dụng Singleton cho thực sự có thể được liên kết với một đối tượng. Một ví dụ khó khăn hơn là một số thứ giống như số bước bạn muốn chạy mô phỏng - nhưng điều này có thể được giải quyết bằng cách có một đối tượng "Mô phỏng". – DJClayworth

+0

Tôi thích ý tưởng của một thực thể quản lý và một thực thể cũng phân phối kiến ​​thức. Vì vậy, một thiết kế tốt sẽ là một lớp singleton giữ thang máy, và một lớp quản lý thang máy có một tham chiếu đến đối tượng đó singleton bulding? – Steve

+0

Tôi mong đợi một trường hợp ElevatorManager *, và để làm cho nó chỉ có sẵn cho các lớp học cần biết về nó. Nếu điều đó có vẻ giống như một số lượng lớn, thì nó thường là một con trỏ mà mô hình của bạn không hoàn toàn đúng. –

0

Bạn có thể tạo một lớp học với một loạt các trường tĩnh công cộng. Một cái gì đó giống như

class AppGlobals { 
    public static final String IMPORTANT_STUFF = "something global..."; 
    .... 

} 

Hoặc bạn có thể đọc trong cấu hình thuộc tính để nhận dữ liệu đơn giản như Strings và whatnot.

Bạn cũng có thể kết hợp 1 và 2.

Chỉnh sửa - cho thang máy của bạn/tòa nhà Ví dụ, thiết kế OO thích hợp sẽ loại bỏ nhu cầu globals ....

1

tôi có thể nghĩ đến một cách tạo một lớp đơn để lưu trữ tất cả các biến toàn cục đó. Sau đó sử dụng các phương thức tĩnh để cung cấp quyền truy cập từ bất kỳ lớp nào. Nhưng có một giải pháp thanh lịch hơn?

Không, đó là cách để thực hiện. Một sự kết hợp của phương pháp tĩnh và đơn.

+0

Tôi có một lớp Tòa nhà đơn giản nhưng luôn gọi Building.getElevators() có vẻ không phù hợp. – Steve

+0

tại sao? Khi bạn nghĩ về nó, bạn đang nhận được thang máy cho tòa nhà bạn đang làm việc. Tên là mô tả. –

1

Bạn có thể tạo một lớp không phải singleton với các trường mong muốn và cung cấp một thể hiện cho bất kỳ thứ gì cần.

Giảm thiểu số lượng mã của bạn giả định một ngữ cảnh như vậy giúp dễ dàng điều chỉnh sau này cho nhiều ngữ cảnh.

Ví dụ: bạn có thể bắt đầu bằng một bộ thang máy duy nhất, nhưng sau đó muốn có nhiều bộ, cho các tòa tháp hoặc tòa nhà khác nhau.

0

Bạn có thể muốn xem xét Mô hình thiết kế Monostate nếu bạn đang tránh xa Singleton. Đây là một câu hỏi StackOverflow tốt trên đó.

Monostate vs. Singleton