2011-08-22 23 views
6

Tôi luôn biết Singletons là "xấu", nhưng chỉ bây giờ tôi đã thực hiện việc chuyển sang Java từ C++, tôi đã quyết định tìm cách xung quanh chúng. Từ một chút đọc, tôi đã thấy rằng một trong hai nhà máy hoặc Dependency Injection có thể có thể làm công việc, nhưng tôi muốn một số xác nhận về điều này.Sử dụng Dependency Injection như một sự thay thế cho Singletons

Ví dụ, tôi chuẩn bị viết một tập phim AnimationCache để lưu trữ Map<String, Animation>. Các lớp khác nhau sẽ có thể có quyền truy cập vào lớp này (về cơ bản) ở bất cứ đâu để chúng có thể tải Ảnh động một cách dễ dàng và hiệu quả. Một ví dụ rất ngắn về những gì mã tương đương sẽ giống như sử dụng DI sẽ là tuyệt vời.

Ngoài ra, Guice là một khuôn khổ tốt cho DI với các ứng dụng không phải web? Tôi đã sử dụng Spring để phát triển web, nhưng tôi không chắc chắn sẽ làm việc cho trò chơi.

+0

Spring DI không chỉ dành cho các ứng dụng web. Cập nhật – gtiwari333

+0

: Bạn cũng có thể xem xét [CDI 2.0 - Ngữ cảnh & Sự phụ thuộc cho Java] (http://cdi-spec.org). Được chuẩn hóa trong [JSR 365] (https://jcp.org/en/jsr/detail?id=365) kể từ 2017-04. Được thiết kế cho * cả hai * Java SE và Java EE. –

+0

Câu hỏi này và câu trả lời của câu hỏi này có thể liên quan đến người đọc trong tương lai: https://stackoverflow.com/questions/130794/what-is-dependency-injection?rq=1 – Cypher

Trả lời

5

Mùa xuân và Guice sẽ hoạt động tốt. Tôi thường thích Guice cho tiêm phụ thuộc thuần túy, nhưng Spring cung cấp nhiều hơn nữa.

Mã này sẽ chỉ giống như thế này:

public class AnimationCacheClient { 

    private AnimationCache cache; 

    @Autowired // for Spring, or 
    @Inject // for Guice (but I think Spring also supports it now) 
    public AnimationCacheClient(AnimationCache cache) { 
     this.cache = cache; 
    } 

    // ... 
} 

tôi personnally thích constructor injection, nhưng bạn cũng có thể sử dụng setter injection hoặc tiêm lĩnh vực.

Lưu ý rằng mục đích của DI không phải là có "những người đơn giản dễ dàng". Mục đích chính của nó là để làm cho mã (của AnimationCacheClient, ở đây) dễ dàng đơn vị-estable, bằng cách có thể tiêm phụ thuộc giả (ở đây, một ví dụ AnimationCache giả).

+0

Cảm ơn bạn đã lấy mẫu mã. Điều đó có vẻ đơn giản, đủ. Vì vậy, tôi đã sai khi giả định rằng Dependency Injection có thể thay thế Singletons? Tôi đang thực sự tìm kiếm một cách tốt hơn cho mã để có quyền truy cập vào một lớp học mà nên chỉ bao giờ là một trong. – Mitch

+0

Không, bạn không sai. Theo mặc định, đậu mùa xuân là đơn. Đậu Guice là nguyên mẫu theo mặc định nhưng có thể được cấu hình để là người độc thân. Tôi chỉ muốn chỉ ra rằng mục tiêu chính của DI không phải là làm cho những người độc thân dễ dàng. Mục tiêu chính của nó là để làm cho thử nghiệm dễ dàng. –

1

Tôi vừa mới 'withnessed' này thread trên Singleton và làm thế nào xấu nó có thể là (hoặc không) và những gì bạn có thể làm để bỏ qua nó. Cũng đáng đọc.

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