2011-04-20 39 views
20

Tôi hiện đang đọc lại "Java hiệu quả" trong khi làm việc tại một cửa hàng sử dụng nhiều công cụ Spring Dependency Injection. Khi đọc cuốn sách của Bloch, người ta không thể không nhận được sự nhấn mạnh mà anh ta đặt vào bất biến trong các lớp học (anh ta nói nhiều lần rằng các lớp học nên càng không thay đổi càng tốt). Tôi không thể không cảm thấy điều này trong cuộc xung đột trực tiếp với sự tin cậy rằng Spring Dependency Injection (và hầu hết các công cụ DI cho thực tế đó) có trên tiêu chuẩn javabeans. Đọc 'Mùa xuân trong Hành động' các chương trên DI có vẻ như họ sẽ làm cho Bloch rạn nứt với các lớp có thể thay đổi của họ bao gồm các đối tượng được phác họa bên ngoài tầm nhìn của bạn.Tính đột biến và mùa xuân

Có phải ý tưởng của Bloch quá mới mẻ đối với mùa xuân không? Mô hình lò xo có bị vỡ không? Lập trường của Bloch về bất biến chỉ áp dụng cho việc viết mã thư viện? Khi viết mã Spring tôi nên viết các đối tượng linh hoạt với nhiều getters và setters hoặc load mọi thứ trong constructor?

+3

Bloch không nói "không bao giờ làm mọi thứ có thể thay đổi được", anh nói "không làm cho chúng dễ biến đổi hơn mức cần thiết". Nếu khuôn khổ của bạn đòi hỏi mức độ đột biến chắc chắn, thì đó là những gì bạn phải sống. – skaffman

+1

Cũng trong hạng mục liên quan đến khả năng biến đổi, các nhà xây dựng lồng ghép, và mô hình xây dựng ông sắp xếp các tiêu chuẩn javabeans (đề cập đến nó như là lỗi thời), nhưng tiêu chuẩn đó là cơ sở của Spring không có nghĩa là mùa xuân đã lỗi thời? – nsfyn55

+0

mùa xuân không phụ thuộc vào tiêu chuẩn javabeans. – Bozho

Trả lời

11

Thực tế, đậu mùa xuân không thay đổi theo ý tưởng, mặc dù bạn không thực thi điều này.

Bạn chỉ có thể cung cấp trình khởi động cho trường final được khởi tạo thông qua quá trình tạo hàm tạo.

Thông thường bạn không làm như vậy, nhưng bạn không bao giờ được phép gán lại các trường đậu được tiêm bởi khung DI. Đó là bởi vì đậu mùa xuân thường không giữ bất kỳ trạng thái nào, ngoài sự phụ thuộc của chúng (và phạm vi của chúng là singleton). Tất nhiên, có những trường hợp ngoại lệ, giống như nguyên mẫu và yêu cầu hạt cà phê, là hiếm (ví dụ trong 2 dự án lớn và 2 trung bình mà tôi đã sử dụng chỉ có 1 hạt đậu nguyên mẫu)

+3

Tôi đồng ý: hầu hết đối tượng Spring instanciated là "singleton" và không thực sự "có thể thay đổi" (dịch vụ, daos, controller, transactionManagers, ...). – Tristan

+0

Nếu tôi tiêm một đối tượng có thể thay đổi vào một trường cuối cùng không ngăn đối tượng đó thay đổi dẫn đến biểu đồ đối tượng mong manh – nsfyn55

+0

@ nsfyn55, nó hoàn toàn tùy thuộc vào bạn đối tượng nào cần tiêm. Nó không liên quan gì đến DI. – Bozho

9

Bạn có thể giữ cho lớp không thay đổi và vẫn còn sử dụng Dependency Injection nếu bạn sử dụng tiêm dựa trên hàm tạo. Bằng cách đó bạn có thể tránh những người định cư không cần thiết.

2

Tôi không thấy bản thân xung đột, đặc biệt là với Spring MVC. Những loại đậu nào được quản lý bởi Spring? Chủ yếu là bộ điều khiển của bạn và trong lớp dịch vụ/dữ liệu của bạn DAO và dịch vụ. Những điều này thường không có nhà nước thực sự anyway và không có setters là tốt. Nếu vấn đề của bạn nằm ở chỗ tiêm setter (ví dụ, bạn có class riêng của bạn cần được Spring quản lý và bạn không muốn setters cho một số field) thì bạn có thể sử dụng constructor injection (hoặc kết hợp cả hai).

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