我有四个类Book Disk Paper Magazine,它们都从另一个类Items派生,并且每个类都有一个String barcode字段。

在另一个类foo中,我有ArrayList<Book> books; ArrayList<Disk> disks; ArrayList<Paper> papers; ArrayList<Magazine> magazines;,并且我想为每个方法实现一个getByBarcode(String barcode)方法,该方法将在arraylist中查找具有该条形码的项目。如果是书籍,则必须在书籍清单等中查找。

我可以避免不得不做四个不同的事情吗?我的意思是避免执行必须在书本列表中查找的getBookByBarcode(String barcode),必须在磁盘列表中查找的getDiskByBarcode(String barcode)等。

并使用public Object getByBarcode(String barcode,type)之类的通用名称。如何以OOP方式很好地做到这一点?

最佳答案

基本上,每本书,杂志,磁盘和纸张都是一个项目。因此,您应该有一个名为Item的父类,而不是其复数形式。每个基类都应归类为单个实体。

然后,您应该创建书籍,杂志,磁盘和纸张对象。由于所有这些都归类为“项目”,因此请创建“项目”类型的数组列表,并将这些对象添加到相同的对象中。

这样,您就有一个包含书籍,杂志,磁盘和纸张的项目列表。然后,您可以在此列表中查找带有条形码的项目,并获取该项目的类型。

源代码:

Item.java

package myLibrary;

public class Item {

    protected String barcode;

    public String getBarcode() {
        return barcode;
    }

    public void setBarcode(String barcode) {
        this.barcode = barcode;
    }

    public Item(String barcode) {
        this.barcode = barcode;
    }
}


Book.java / Disk.java / Magazine.java / Paper.java

package myLibrary;

public class Book extends Item {

    public Book(String barcode) {
        super(barcode);
    }

    public String getBarcode() {
        return barcode;
    }


}


Lecturer.java(包含主函数的类)

package myCollege;

import java.util.ArrayList;
import myLibrary.Book;
import myLibrary.Disk;
import myLibrary.Item;
import myLibrary.Magazine;
import myLibrary.Paper;

public class Lecturer {

    public static void main(String[] args) {

        // Declare items
        Book x1 = new Book("Item101");
        Book x2 = new Book("Item102");
        Disk x3 = new Disk("Item201");
        Disk x4 = new Disk("Item202");
        Magazine x5 = new Magazine("Item301");
        Paper x6 = new Paper("Item401");
        Paper x7 = new Paper("Item402");

        ArrayList<Item> items = new ArrayList<>();
        items.add(x1);
        items.add(x2);
        items.add(x3);
        items.add(x4);
        items.add(x5);
        items.add(x6);
        items.add(x7);

        String itemType = getItemByBarcode("Item202", items);
        System.out.println(itemType);


    }

    private static String getItemByBarcode(String barcode, ArrayList<Item> items) {
        String itemType = "";
        for(Item i : items) {
            if(i.getBarcode().equalsIgnoreCase(barcode)) {
                itemType = i.getClass().getSimpleName();
            }
        }
        return itemType;
    }

}


输出:

Disk


我希望这有助于更好地理解概念/问题。

关于java - 泛化类的ArrayList之间的搜索方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27073183/

10-13 04:08
查看更多