Wywołanie metody w innej klasie

0

Witam, jestem początkującym użytkownikiem Javy. Uczę się jej sam w domu w wolnym czasie i postanowiłem zacząć pisać program w stylu organizatora finansów (dodawanie przychodów, wydatków itp.). W programie w klasie DataBase mam metodę dodającą przychód do tablicy oraz metodę, dzięki której dla każdego elementu przypisanego do tablicy zostanie potem wyświetlona informacja o nim, natomiast w klasie Control jest ona wywoływana w przypadku wybrania opcji nr 2.

klasa DataBase:

public class DataBase {
    public static final int MAX_INCOME_NUMBER = 10000;
    private Income[] incomes;
    private int incomeNumber;

    public int getIncomeNumber() {
        return incomeNumber;
    }

    public Income[] getIncomes() {
        return incomes;
    }
    public DataBase() {
        incomes = new Income[MAX_INCOME_NUMBER];
    }

    public void addIncome(Income income) {
        if(incomeNumber < MAX_INCOME_NUMBER) {
            incomes[incomeNumber] = income;
            incomeNumber++;
        } else {
            System.out.println("Maksymalna liczba przychodów została osiągnięta");
        }
    }

    public void printIncome() {
        if(incomeNumber == 0) {
            System.out.println("Brak przychodów");
        } else {
            for(int i=0; i<incomeNumber; i++) {
                getIncomes()[i].printInfo();
            }
        }
    }
}

klasa Control


public class Control {
    public static final int EXIT = 0;
    public static final int ADD_INCOME = 1;
    public static final int PRINT_INCOME = 2;
    private AddData addData;
    private DataBase dataBase;

    public Control() {
        addData = new AddData();
        dataBase = new DataBase();
    }

    public void addIncome() {
        Income income = addData.createIncome();
        dataBase.addIncome(income);
    }

    public void printIncome() {
        dataBase.printIncome();
    }

    public void printOptions() {
        System.out.println("0 - wyjście z programu");
        System.out.println("1 - dodaj przychód");
        System.out.println("2 - pokaż przychody");
    }

    public void ControlLoop() {
        int option;
        printOptions();
        while((option = addData.getOption()) != EXIT) {
            switch(option) {
            case ADD_INCOME:
                addIncome();
                break;
            case PRINT_INCOME:
                printIncome();
                break;
            default:
                System.out.println("Nie ma takiej opcji");
            }
            printOptions();
        }
        addData.close();
    }
}

Chciałem przenieść metodę printIncome z klasy DataBase do zupełnie innej klasy (np. klasa Info) i następnie wywołać ją w klasie DataBase po wybraniu opcji 2. Wszystko wydaje się spoko, program się kompiluje jednak po dodaniu przychodu a następnie wybraniu opcji wyświetlenia go cały pokazywany jest napis "Brak przychodów" zamiast dodanego przychodu. Chciałem się spytać gdzie popełniam błąd i czy jest możliwe (i czy w ogóle ma sens) wydzielenie tej metody do osobnej klasy.

klasa Info

public class Info {
    private DataBase db;

    public Info() {
        db = new DataBase();
    }

    public void printIncome() {
        if(db.getIncomeNumber() == 0) {
            System.out.println("Brak przychodów");
        } else {
            for(int i=0; i<db.getIncomeNumber(); i++) {
                db.getIncomes()[i].printInfo();
            }
        }
    }
}
0

W klasie Info zawsze tworzysz nowy obiekt klasy DataBase- powinieneś przesłać do tej klasy Info istniejący obiekt (dokładniej ten, na rzecz którego dodawałeś przychód)- np. poprzez parametr konstruktora.

0

Czyli do konstruktora public Info() mam przekazać jako argument obiekt klasy DataBase?

0

Tak, i musisz go zapamiętać w polu, żeby był widoczny w każdej metodzie.

public class Info {
    private DataBase db;

    public Info(DataBase db) {
        this.db = db;
    }
    ...
0

Dziękuję, działa :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0