2011-06-29 38 views
5

Tôi đang gặp vấn đề khi nắm bắt một thứ gì đó - tôi có thể sắp sửa hoàn toàn sai.Mở rộng ArrayList và tạo các phương thức mới

Tôi cố gắng để tạo ra một lớp mà kéo dài ArrayList nhưng có một số phương pháp làm tăng chức năng (ít nhất là trong chương trình tôi đang phát triển.)

Một trong những phương pháp là một findById (int id), trong đó tìm kiếm từng đối tượng ArrayList cho một đối sánh id cụ thể. Cho đến giờ nó hoạt động, nhưng nó sẽ không cho phép tôi làm for (Item i : this) { i.getId(); }

Tôi không hiểu tại sao?

Full mã:

public class CustomArrayList<Item> extends ArrayList<Item> { 

    // declare singleton instance 
    protected static CustomArrayList instance; 

    // private constructor 
    private CustomArrayList(){ 
     // do nothing 
    } 

    // get instance of class - singleton 
    public static CustomArrayList getInstance(){ 
     if (instance == null){ 
      instance = new CustomArrayList(); 
     } 
     return instance; 
    } 

    public Item findById(int id){ 
     Item item = null; 
     for (Item i : this) { 
      if (i.getId() == id) { 
         // something 
     } 
     } 
     return item; 
    } 
    public void printList(){ 
     String print = ""; 
     for (Item i : this) { 
      print += i.toString() + "\n"; 
     } 
     System.out.println(print); 
    } 
} 

Trả lời

7

Thay đổi

public class CustomArrayList<Item> extends ArrayList<Item> { 

để

public class CustomArrayList extends ArrayList<Item> { 

tôi nghi ngờ Item là tên của lớp mà bạn muốn để lưu trữ trong danh sách . Bằng cách thêm <Item> sau CustomArrayList, bạn đang giới thiệu thông số loại làm bóng lớp này.


Với tham số <Item>, mã của bạn bằng

public class CustomArrayList<T> extends ArrayList<T> { 
    // ... 
     for (T i : this) { i.getId(); } 
    // ... 
} 

mà rõ ràng sẽ không luôn luôn làm việc, như T có thể tham khảo bất kỳ loại.

+0

Tuyệt vời. Đó có phải là cú pháp thích hợp không, hay tôi đang cố gắng làm điều gì đó khác? Cảm ơn bạn rất nhiều! Trả lời nhanh. – Cody

+1

Đó có thể là cú pháp thích hợp cho kịch bản của bạn. Đã cập nhật câu trả lời để giải thích lý do. – aioobe

+1

Cảm ơn bạn! Điều đó giải thích nó rất tốt. – Cody

2

getId() là gì? Có lẽ đó là một phương pháp trong một số lớp học, nhưng chúng tôi không biết mà lớp học.

Nếu bạn đã thực sự có một lớp được gọi là Item với phương thức getId(), đây có nghĩa là danh sách, bạn chỉ cần dừng lớp học của bạn khỏi chung chung. Vì vậy, thay vì điều này:

public class CustomArrayList<Item> extends ArrayList<Item> { 

bạn muốn:

public class CustomArrayList extends ArrayList<Item> { 

Hiện nay trong lớp học của bạn, Item không đề cập đến một lớp được gọi là Item, nó đề cập đến một loại tham số gọi Item.

Bây giờ cá nhân:

  • tôi sẽ không tránh tạo ra độc thân, trừ khi bạn thực sự phải
  • Nếu bạn phải, tôi muốn tránh tạo ra chúng theo cách bạn có (mà không phải là thread -safe)
  • Tôi sẽ không mở rộng ArrayList<> trừ khi tôi thực sự phải, thích thành phần hơn thừa kế
+0

Tôi đang tạo ra một singleton vì lý do mà tôi chỉ có thể có một. Tôi biết rằng cách tôi tạo ra nó không phải là chủ đề an toàn - tôi sẽ cần phải có một "phương pháp khóa", đúng không? Những gì aioobe đăng bài giải quyết vấn đề của tôi, nhưng tôi vẫn quan tâm đến việc tạo ra một singleton thread-an toàn. – Cody

+1

Cách ưa thích để tạo một singleton trong Java 1.5+ là sử dụng một Enum. Xem ví dụ câu hỏi này: http://stackoverflow.com/questions/70689/efficient-way-to-implement-singleton-pattern-in-java – aioobe

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