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