2012-07-20 2 views
6

Vì vậy, như tôi hiểu, một trong những nên luôn chương trình để một giao diện, như trong:Lập trình với một giao diện - tránh các diễn viên sau

List<Integer> list = new LinkedList<Integer>(); 

Vì vậy, sau này trong chương trình của tôi, tôi có:

public List<Integer> getIntegers() { 
    return list; 
} 

public void processIntegers() { 
    // I need an arraylist here 
    ArrayList<Integer> list = (ArrayList<Integer>) getIntegers(); // can I do this better, without a cast? 
} 

Tôi có thể làm theo một mô hình tốt hơn ở đây hoặc bằng cách nào đó làm điều gì đó để tránh dàn diễn viên không? Đúc có vẻ rất xấu trong kịch bản này.

Cảm ơn.

+1

tôi cũng sẽ hỏi tại sao điều này là tốt hơn sau đó sử dụng tất cả các thời gian một arrayList nếu cuối cùng một diễn viên là không thể tránh khỏi. – dontcare

+0

@dontcare Vì vậy, bạn có thể chuyển danh sách các số nguyên này cho một hàm chung mà chỉ chấp nhận một danh sách, không phải là một danh sách mảng cụ thể. – jn1kk

+0

bạn nên lập trình cho loại ít nhất cụ thể mà bạn có thể thoát ra và không còn nữa. – plasma147

Trả lời

7

Trước hết hãy tự hỏi mình một câu hỏi: tại sao bạn cần số ArrayList? Hơn nữa, các khách hàng của API của bạn có quan tâm đến nó không? Bạn có vài lựa chọn:

  • làm getIntegers() trở ArrayList<Integer>. Đó không phải là tội phạm

  • Xem xét yêu cầu giao diện ít mạnh hơn, ví dụ: AbstractList như một sự đồng thuận

  • Tạo một bản sao phòng thủ để bạn có thể tiêu thụ bất kỳ List:

    ArrayList<Integer> list = new ArrayList<Integer>(getIntegers()); 
    

    xem xét sử dụng instanceof điều hành để tránh sao chép không cần thiết nếu getIntegers() đã là một ArrayList.

Nói cách khác - không có cách nào để tránh việc truyền này theo yêu cầu của bạn và thanh lịch.