Обобщение метода поиска между ArrayLists классов

1

У меня есть четыре класса Book Disk Paper Magazine все они вытекают из другого класса Items, и все они имеют String barcode поле.

В другом классе foo меня есть ArrayList<Book> books; ArrayList<Disk> disks; ArrayList<Paper> papers; ArrayList<Magazine> magazines; 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) такой как public Object getByBarcode(String barcode,type). Как я могу сделать это в ООП?

  • 0
    T getByBarCode(List<T extends Items> items, String barCode) Подпись должна сказать все это.
  • 0
    Да, но функция getByBarCode будет вызываться извне foo , а другой вызывающий ее класс не имеет доступа к спискам элементов.
Показать ещё 2 комментария
Теги:

2 ответа

1
Лучший ответ

По существу каждая книга, журнал, диск и бумага - это предмет. Следовательно, у вас должен быть родительский класс с именем Item, а не его множественная форма. Каждый базовый класс должен классифицироваться как исключительная сущность.

Затем вы должны создавать объекты книги, журнала, диска и бумаги. Поскольку все они классифицируются как Item, создайте список массивов типа 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

Надеюсь, это поможет лучше понять концепцию/проблему.

  • 1
    Я не вижу ценности, добавленной дженериками в Item или Lecturer .
  • 0
    Отредактировал их, поскольку они не требуются в этом случае. Спасибо за обзорный комментарий Макото.
1

может показаться хакерским, но вы можете сделать так, как предлагают некоторые другие пользователи

public Object getByBarcode(String barcode, Class<T> classy)
{
   ArrayList<Items> items = null;
   if(classy.class.getSimpleName().equals(Book.class.getSimpleName()))
       items = bookArray;
   else if(classy.class.getSimpleName().equals(Magazine.class.getSimpleName()))
       items = magazineArray;
   else 
       ... cnt'd  


   for(Item i : items) 
       if( i.getBarCode().equals(barcode) return i;
} 

Затем, чтобы назвать этот зверский беспорядок, вы могли бы сделать что-то вроде этого. , ,

Item i = getByBarCode("0932A3", Book.class);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню