2010-02-02 34 views
18

Tôi có phương thức List<Foo> getFoos() lấy dữ liệu từ máy chủ từ xa và trả về.Có chấp nhận trả lại unmodifiableList hoặc tôi có nên trả về mảng không?

Tất nhiên, người dùng không được thay đổi số mục trong danh sách vì anh ta sẽ nhận dữ liệu không được đồng bộ hóa với dữ liệu trên máy chủ (và nếu muốn thay đổi số mục anh ta có các phương pháp đặc biệt như addFoo()).

Cách tiếp cận đầu tiên là trả về mảng và thay đổi chữ ký của phương thức thành Foo[] getFoos(). Nhưng nó phổ biến hơn trong java và thuận tiện hơn cho người dùng để hoạt động với các bộ sưu tập vì vậy tôi đã thay đổi chữ ký thành List<Foo> getFoos(). Phương pháp này luôn trả về

Collections.unmodifiableList (originalList)

Vì vậy, khi người dùng cố gắng để thay đổi danh sách, ông sẽ nhận được RuntimeException.

Có đề xuất nào về thiết kế api trong các trường hợp tương tự không?

Trả lời

23

Collections.unmodifiableList hoàn toàn có thể chấp nhận được và phải nhanh hơn (không cần tạo mảng).

Chỉnh sửa - Về mặt thiết kế API, bạn chỉ nên làm cho JavaDoc của bạn rõ ràng! Những người sử dụng một phương pháp mà không đọc tài liệu của nó xứng đáng với sự ngạc nhiên: p

+0

Tôi quan tâm hơn cho dù điều này làm người dùng nhầm lẫn và khiến họ nghĩ rằng họ có thể sửa đổi danh sách và tất cả nội dung đồng bộ hóa sẽ được thực hiện tự động (đồng bộ với máy chủ tôi có ý nghĩa). – Roman

+1

Tất nhiên, sau khi RuntimeException đầu tiên tất cả người dùng bối rối chắc chắn sẽ hiểu rằng họ không thể làm điều đó đơn giản như vậy :) – Roman

+0

@Roman Trong tài liệu của bạn, bạn chỉ cần có một danh sách không thể sửa đổi được trả về. – Poindexter

0

Nếu bạn muốn một tài sản chuyên biệt, tùy chỉnh từ một đối tượng hiện có hoặc Danh sách trong trường hợp này không thử mở rộng hoặc chứa nó. một ngoại lệ?

Lý do là vì bạn có thể muốn cho phép một số đối tượng khách hàng khác sửa đổi danh sách; nó phụ thuộc vào mức độ gần với mức ứng dụng là dữ liệu trả về.

+1

Tôi không nghĩ rằng việc mở rộng Danh sách là một cách tiếp cận tốt hơn là chỉ sử dụng unmodifiableList. Đó là công việc nhiều hơn và rất có khả năng việc thực hiện của riêng bạn không tốt bằng cách thực hiện bởi các nhà phát triển Java. –

+0

Tôi sẽ bỏ phiếu cho bạn, ngoại trừ thực tế là bạn đã đề cập kéo dài trong cùng một hơi thở như có chứa. Chứa có lẽ là câu trả lời hay nhất, việc mở rộng sẽ là điều tồi tệ nhất. –

2

Tôi cũng nói rằng nó hoàn toàn có thể chấp nhận và tốt hơn nhiều so với trả về một mảng (trong đó some đề xuất nên được coi là loại không dùng nữa). Tuy nhiên, nếu bạn muốn rõ ràng hơn về API trong API, bạn có thể xem xét trả lại ImmutableList từ Google Collections.

+0

Vâng, các bộ sưu tập không thể thay đổi * là hoàn hảo cho loại điều này. – ColinD

+1

Tôi không chắc rằng nó có thể được gọi là một thực hành tốt để sử dụng các lớp học từ thư viện của bên thứ ba trong API (ngay cả khi nó được viết bởi google). – Roman

+0

Nếu thư viện đó không thực hiện một cam kết công khai về tính tương thích ngược đời đời, giống như JDK, bạn sẽ đúng. Tuy nhiên, trong trường hợp của Google Collections, bạn an toàn. –

1

Tôi hầu như không bao giờ trả lại danh sách hoặc mảng khỏa thân. Nếu bạn có một bộ sưu tập của một cái gì đó, nó gần như luôn luôn có một số mã ở đâu đó liên kết với nó mà phải là một phần của bộ sưu tập đó. Bằng cách không có một lớp học xung quanh bộ sưu tập, bạn buộc phải sao chép mã đó trên các vị trí khác nhau nơi bộ sưu tập được sử dụng.

Cũng có một hoặc hai biến được liên kết với bộ sưu tập. Bạn sẽ thấy bạn vượt qua chúng bất cứ khi nào bạn vượt qua bộ sưu tập. Chúng thuộc về lớp logic kinh doanh kết thúc tốt đẹp bộ sưu tập.

0

Nếu bạn có tự do hoàn toàn và có vẻ như bạn làm, thì bạn không cần phải chọn giữa mảng hoặc Danh sách, thay vì trả về một trình lặp. Điều này cũng sẽ giúp ích nếu bạn cần tính duy nhất thay vì trả về bộ lặp - vẫn trả về.

+2

Bạn có thực sự nghĩ rằng việc có được một trình vòng lặp thuận tiện hơn cho người dùng hơn là lấy Danh sách hoặc Đặt hoặc Mảng ?? (tip: nếu anh ta cần phải lặp lại hai lần? nếu anh ta cần để có được kích thước? nếu anh ta cần phải làm việc với toàn bộ bộ sưu tập hơn là với các yếu tố cụ thể tức là làm hoạt động như xxxAll() ...) – Roman

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