Вызов метода getName () в одном классе работает, но в другом - нет - PullRequest
0 голосов
/ 18 марта 2020

Я делаю программу для перебора массива объектов и вывода их на экран. Для этого я использую метод getName (). Когда я вызываю его из одного из моих классов, ничего не возвращается, но вызов из другого класса работает.

public class Customer {

    String name;

    public Customer(String name) {
        this.name=name;
    }


    public String getName() {

        return this.name;
    }

}

Код выше - это метод getName (), который я хочу вызвать.

public class Store {

    private String name;
    private ArrayList<Customer> customersStore;

    public Store(String name) {
        this.name=name;
        customersStore=new ArrayList<Customer>();
    }

    public void addCustomer(Customer customer) {
        customersStore.add(customer);
        for(int i  = 0; i<customersStore.size();i++){
           System.out.print(customersStore.get(i).getName() + " ");
        }
    }

    public String getName() {
        return this.name;
    }

    public ArrayList<Customer> getCustomers() {
        return this.customersStore;
    }

}

Поскольку программа не печатала ничего как способ отладки, я заставлял программу распечатывать массив при каждом вводе нового значения и обнаруживать, что он работает.

public class StoreView implements Observer{

    public void printStoreDetails(Store store) {

        ArrayList<Customer> customerList;

        // Displaying the customer list

        customerList = store.getCustomers();

        // Displaying the values after iterating through the list
        System.out.println("\nThe Customer names are:");
        for(int i  = 0; i<customerList.size();i++){
            System.out.print(customerList.get(i).getName() + " ");
        }
    }

    @Override
    public void update(Observable o, Object name) {

        printStoreDetails(new Store("Sears"));
    }
}

Однако, когда Я пытаюсь вызвать его из класса StoreView выше, он ничего не печатает. Вот чего я не понимаю.

Ввод получен со сканера в основном классе

public class Main {

    public static void main(String[] args) {
            Scanner input = new Scanner(System.in);

            Store myStore = new Store("Sears");
            StoreView myStoreView = new StoreView();

            StoreController myStoreController = new StoreController(myStore, myStoreView);
            Customer aCustomer;

            System.out.println("Enter customer names for store " + myStore.getName());

            myStoreController.addObserver(myStoreView);

            while(input.hasNext()) {
                aCustomer = new Customer(input.nextLine());
                myStoreController.addCustomer(aCustomer);
            }


        }
    }

Затем вход отправляется в StoreController для добавления в ArrayList

public class StoreController extends Observable {

    private Store model;
    private StoreView view;

    public StoreController(Store model, StoreView view){
        this.model = model;
        this.view = view;
    }

    public void addCustomer(Customer name){
        model.addCustomer(name);
        setChanged();
        notifyObservers();
    }


}

Я не очень знаком с наблюдателями, но общая цель программы - обновлять StoreView всякий раз, когда клиенты добавляются в Store через StoreController. Любая помощь приветствуется.

1 Ответ

1 голос
/ 18 марта 2020

Вы создаете новый экземпляр Store при обновлении наблюдателя; таким образом, он имеет пустой массив клиентов.
Измените notifyObservers(); на notifyObservers(model); и метод обновления:

    @Override
    public void update(Observable o, Object store) {
        if (store instanceof Store) {
            printStoreDetails((Store) store);
        }
    }
...