2014-06-11 18 views
11

Nhìn vào javadoc tôi thấy rằng một ArrayList có một add phương pháp quá tải:Tại sao List.add (E) trả về boolean trong khi List.Add (int, E) trả về void?

public boolean add (E e)

Gắn các yếu tố quy định đến hết danh sách này.

public void add (int index, yếu tố E)

Chèn các yếu tố quy định tại vị trí quy định trong danh sách này. Thay đổi phần tử hiện tại ở vị trí đó (nếu có) và bất kỳ phần tử tiếp theo nào ở bên phải (thêm một phần tử vào chỉ mục của chúng).

tôi nhận thấy rằng một trong những đầu tiên quay trở lại một boolean trong khi cái thứ hai là một void. Khi nó quay ra, các add đầu tiên đã trở lại một boolean vì:

Returns: đúng (theo quy định của Collection.add (E))

Vì vậy, tôi đã đi đến Collection.add(E):

thêm boolean (E e)

Đảm bảo rằng bộ sưu tập này chứa phần tử được chỉ định (hoạt động tùy chọn). Trả về true nếu bộ sưu tập này thay đổi do cuộc gọi. (Trả về false nếu bộ sưu tập này không cho phép các bản sao và đã chứa phần tử được chỉ định.)

Vì vậy, câu hỏi của tôi là, tại sao add được chỉ định trả về boolean thay vì là khoảng trống? Khi tôi add điều tôi mong đợi chỉ thực hiện một thao tác.

Tôi hiểu rằng có các cấu trúc dữ liệu khác, trái ngược với ArrayList, không cho phép các bản sao (chẳng hạn như tập hợp). Nhưng thậm chí sau đó, có thể không phải là vấn đề được giải quyết dọc theo dòng:

public void add(E e){ 
    if(e is not in set){ 
     add e; 
    } 
} 

Bằng cách đó nếu e IS trong các thiết lập không có hành động được thực hiện. Tại sao nên trả lại một boolean thay vì cách tiếp cận void?

+0

Tôi đoán là bởi vì đôi khi bạn có thể muốn biết nếu bạn không đặt thứ gì đó vào một bộ. Nếu 'void' được trả về thì không có cách nào biết được việc tìm kiếm phần tử đó sau đó. Không thể nghĩ ra bất kỳ ví dụ nào có liên quan ngoài đỉnh đầu của tôi ... – awksp

+0

Mã của bạn sẽ không thực hiện công việc tương tự vì nó không cho người gọi biết nếu nó đã chứa đối tượng. Mã tương đương sẽ có một .contains trước .add –

+0

Nếu bạn không quan tâm về việc liệu lệnh gọi 'add' có gây ra bất kỳ thay đổi nào, bạn không bắt buộc phải làm bất cứ điều gì với kết quả. Nhưng những người khác có thể tìm thấy thông tin hữu ích. – Alex

Trả lời

17

Collection.add là một phương pháp khá chung chung (không phải theo nghĩa Java Generics - theo nghĩa rộng rãi được áp dụng). Như vậy, họ muốn có một giá trị trả về sẽ áp dụng chung.

Một số lớp (như ArrayList) luôn chấp nhận yếu tố, và như vậy sẽ luôn luôn trả true. Bạn nói đúng rằng trong những trường hợp này, kiểu trả về là void sẽ là tốt.

Nhưng những người khác, như Set, đôi khi sẽ không cho phép thêm phần tử. Trong trường hợp của Set, điều này xảy ra nếu một phần tử bằng nhau đã có mặt. Nó thường hữu ích để biết điều đó. Một ví dụ khác là một bộ sưu tập bị chặn (chỉ có thể chứa một số phần tử nhất định).

Bạn có thể hỏi, "không thể mã chỉ cần kiểm tra điều này theo cách thủ công?" Ví dụ, với một bộ:

if (!set.contains(item)) { 
    set.add(item); 
    itemWasAdded(item); 
} 

Đây là chi tiết rườm rà so với những gì bạn có thể làm bây giờ, nhưng không phải là một toàn bộ rất nhiều:

if (set.add(item)) { 
    itemWasAdded(item); 
} 

Nhưng điều này trả phòng lúc bấy giờ hành động hành vi không phải là thread an toàn, có thể rất quan trọng trong các ứng dụng đa luồng. Ví dụ: có thể một chuỗi khác đã thêm một mục bằng nhau giữa bạn kiểm tra set.contains(item)set.add(item) trong đoạn mã đầu tiên. Trong một kịch bản đa luồng, hai hành động đó thực sự cần phải là một hành động nguyên tử duy nhất; trả lại boolean từ phương thức làm cho điều đó có thể xảy ra.

+0

'không theo nghĩa Java Generics' - cảm ơn Chúa! :) 1, câu trả lời hay. – nawfal

+1

Kiểm tra và sau đó thêm cũng có thể có khả năng không hiệu quả đối với một số loại triển khai, do đó, nó tốt đẹp API cho phép bạn làm điều đó một cách tốt hơn cho những trường hợp đó. –

+0

Cảm ơn bạn đã trả lời. Tôi không đồng ý với một chi tiết. 'loại trả lại của khoảng trống sẽ chỉ là tốt'. Cho đến bây giờ tôi không tìm thấy bất kỳ tình huống nào mà khoảng trống trả về sẽ là một ý tưởng hay. Tôi thà có thêm đối tượng được trả về hơn void. –

1

bởi vì thường hữu ích nếu bạn biết nếu một thứ gì đó thực sự được thêm vào hoặc đã thay đổi ở đó.

+0

Câu trả lời này phù hợp hơn với nhận xét. –

+0

tất cả các câu trả lời phù hợp với nhận xét, câu trả lời thực sự là trong javadocs -> 'Trả về: đúng nếu bộ sưu tập này thay đổi do cuộc gọi' nói lên tất cả. ... không công bằng xuống phiếu bầu ... – A4L

+0

Không, mọi người chỉ đọc tiêu đề thay cho bài đăng. –

2

Vì đó là thông tin bổ sung không chi phí và có thể hữu ích trong một số trường hợp nhất định. Ví dụ:

Set<String> set = new HashSet<String>(); 
set.add("foobar"); 
boolean wasAlreadyThere = set.add("foobar"); 

Nếu không, bạn sẽ phải làm

boolean wasAlreadyThere = set.contains("foobar"); 
set.add("foobar"); 

đòi hỏi hai lần làm việc (trước hết bạn phải tra cứu, sau đó tra cứu một lần nữa để thêm).

+0

Không phải để có được tất cả các pedantic, nhưng ... không phải là logic ngược trong ví dụ đầu tiên? – Alex

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