5

Tôi có một lớp mô hình (MVC pattern) mà tôi đang sử dụng trong hai dự án Eclipse.truy cập các trường riêng tư trong các lớp được chia sẻ trên các dự án Eclipse

Một dự án, hãy gọi nó là Producer, đang thu thập dữ liệu từ luồng và lưu trữ dữ liệu đó vào cơ sở dữ liệu. Lớp mô hình được đề cập, giả sử ObjectModel, được sử dụng để deserialize luồng cho thao tác trước khi tuần tự hóa và lưu trữ trong db.

Một dự án khác, hãy gọi nó là Consumer, đang lấy dữ liệu được lưu trữ trong cơ sở dữ liệu và trực quan hóa nó trên màn hình. Nó sử dụng cùng một lớp mô hình để deserialize dữ liệu được lưu trữ để sử dụng trong ứng dụng trực quan hóa.

Tôi dự định đặt ObjectModel vào một dự án Eclipse để chia sẻ nguồn của mình trên các dự án ProducerConsumer. Tuy nhiên, mỗi ứng dụng có các lớp hiện tại trong cùng một gói tận dụng lợi thế của trình sửa đổi truy cập gói riêng để nhận và đặt các trường trong ObjectModel.

Có cách nào tôi có thể chia sẻ nguồn trên nhiều dự án Eclipse và vẫn duy trì quyền truy cập gói riêng tư với nguồn được chia sẻ không?

CẬP NHẬT: Tôi gặp sự cố khi nhận mã được chia sẻ trên các dự án Eclipse, đó là lý do tôi không thử trước khi đăng. Cuối cùng, có phần đó hoạt động và viết nó như một câu trả lời khác here.

+0

bạn có thể giải thích tại sao bạn muốn 'vẫn duy trì quyền truy cập gói riêng tư với nguồn được chia sẻ không? '? – Vikdor

+0

'Nhà sản xuất' có một lớp,' ObjectModelFactory', tạo ra các cá thể 'ObjectModel' đóng gói dữ liệu từ nhiều luồng riêng biệt. 'Consumer' có một lớp,' ObjectModelMerger', kết hợp các cập nhật trực tiếp vào trong 'ObjectModel' của deserialized. Thật thú vị hơn cho mỗi lớp để truy cập trực tiếp các trường 'ObjectModel' hơn là đi qua các trình truy cập, đặc biệt vì không cần các bộ định cư trong bất kỳ phần nào của chương trình ngoại trừ' ObjectModelFactory' và 'ObjectModelMerger' - tôi muốn giới hạn truy cập vào trường 'ObjectModel'. – ericsoco

Trả lời

1

Miễn là các lớp trong dự án Nhà sản xuất và người tiêu dùng được khai báo trong cùng một gói với ObjectModel, tất cả chỉ hoạt động.

Tuy nhiên, bạn có thể muốn suy nghĩ lại về thiết kế của mình và cung cấp các phương thức truy cập công khai (getters và setters) trong ObjectModel.

+0

xin vui lòng xem bình luận của tôi ở trên lại: thiết kế. – ericsoco

1

Nhìn về câu trả lời @GreyBeardedGeek trên:

Chừng nào các lớp trong các dự án sản xuất và tiêu dùng được khai báo trong gói giống như ObjectModel, cần tất cả chỉ làm việc.

Bạn đang tìm kiếm người bạn C++ bằng Java. Nói chung, nó có thể là triệu chứng của thiết kế sai. Nếu thiết kế của bạn là ok, sau đó sử dụng "truy cập gói riêng" là cách chuẩn Java để thực hiện bạn bè. Nó sẽ hoạt động về mặt kỹ thuật nếu các lớp của bạn nằm trong các dự án khác nhau ... Nếu bạn nghĩ rằng thiết kế của bạn là ok, có thể bạn muốn cân nhắc sử dụng lớp * Heper. Ví dụ:

public class SomeClass { 
void foo(){... 
} 
} 

public class SomeClassHelper { 
private SomeClass someClass; 
public SomeClassHelper(SomeClass someClass){ 
    //you can do it better this with some DI Framework, 
    //for illustration purpose 
    this.someClass=someClass; 
} 

public SomeClassHelper(){ 
    //for illustration purpose only 
    this.someClass=new SomeClass(); 
} 

**public** void foo(){ 
    //this is punch line 
    someClass.foo(); 
    } 

}

Bạn nên đặt SomeClassHelper tại cùng một gói như SomeClass, nhưng SomeClassHelper có thể ở thư mục nguồn khác nhau, dự án.

+0

Bạn chưa từng thấy mẫu Bạn bè trước đây, cảm ơn minh họa. dường như có lợi cho việc hiển thị một tập hợp con của chức năng, nhưng trong trường hợp này tôi muốn ghi quyền truy cập vào tất cả các trường 'ObjectModel', vì vậy điều này sẽ tương tự với các trình truy cập trực tiếp trong' ObjectModel' - nhiều mã hơn tôi muốn . – ericsoco

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