2013-05-16 17 views
13

Tôi mới dùng dao găm (mặc dù tôi có kinh nghiệm với DI khi làm việc trên Java EE WebApps bằng Weld).Tách phụ thuộc Dagger của Android không thành công trên các trường riêng tư

Điều tôi đang cố gắng làm là tiêm phụ thuộc vào một lớp học. Trường là riêng tư.

Dagger sau đó ném ngoại lệ cho biết nó không thể đưa vào trường riêng tư.

Lý do cho điều đó là gì?

Sau khi tất cả chúng ta có thể viết thư cho lĩnh vực tư nhân sử dụng phản xạ, ngay cả trên android ..

Nếu tôi đặt tầm nhìn của lĩnh vực này để một cái gì đó khác hơn là tin tiêm dường như làm việc.

Trả lời

16

Đặt trường riêng tư là 'gói có thể nhìn thấy' có thể không phải lúc nào cũng như những gì bạn muốn. Tài liệu Dagger gợi ý những điều sau:

Tiêm các trường cuối cùng và thành viên riêng tư. Để có hiệu suất tốt nhất Dagger tạo mã. Làm việc xung quanh điều này bằng cách sử dụng constructor tiêm.

Dưới đây là một ví dụ:

private ItemFactoryImpl itemFactory; 
private BuildingFactory buildingFactory; 

@Inject 
public World(ItemFactoryImpl itemFactory, BuildingFactory buildingFactory) { 
    this.itemFactory = itemFactory; 
    this.buildingFactory = buildingFactory; 
} 
+0

Rất tốt, cảm ơn bạn đã nhập liệu. Xây dựng Injection là một cái gì đó tôi được sử dụng để làm việc với CDI .. –

+7

Điều này làm việc cho các loại có thể xây dựng, nhưng các loại hệ điều hành Android như Hoạt động, Ứng dụng, Phân đoạn không có ý định được xây dựng bởi bất cứ điều gì ngoài khuôn khổ Android. cần thiết trong những trường hợp này. Nhưng đây là lời khuyên tốt nơi bạn có quyền kiểm soát đối với hàm tạo. –

1

Chỉ cần xóa private để đặt chế độ hiển thị của trường thành gói thân thiện.

Dagger không hỗ trợ tiêm trên các trường riêng tư.

31

Dagger không thể hỗ trợ các trường riêng tư và vẫn hỗ trợ bộ điều hợp được tạo mã (để tránh phản chiếu). Các hệ thống cách thức như Guice hỗ trợ các trường riêng tư là chúng thay đổi quyền truy cập vào trường một cách phản ánh trước khi truy cập chúng. Vì dao găm tạo ra một InjectAdapter trong cùng một gói như lớp được tiêm, nó có thể truy cập các trường thân thiện, được bảo vệ hoặc công khai. Nó không thể truy cập các trường riêng.

Một trong những ưu điểm của Dagger là nó tránh được sự phản chiếu, vì vậy việc sử dụng phản xạ để bỏ qua khả năng hiển thị trường không phải là một tính năng mong muốn.

+0

Làm cho ý nghĩa với tôi. Sẽ đánh dấu câu trả lời này là câu trả lời chính xác. Cảm ơn bạn ! –

+0

Bất cứ lúc nào. :) Hãy bình chọn nó lên quá. ;) –