pobieranie wartości getterem

0

Dlaczego getter pobiera dane z pól klasy WczytanieDanych, a nie uwzględnia ich modyfikacji w metodzie wczytaj()?
Np. bez względu na to ile razy się inkrementuje zmienna int iloscKont to getter pobiera wartość 0

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;

public class WczytanieDanych {
    private String plikZDanymi = "baza.dat";
    private Konto[] konta = new Konto[100];
    private int iloscKont = 0;
    private long koniecPliku = 0;



    File file = new File(plikZDanymi);

    public void wczytaj() throws IOException {
        if (!file.exists()) {
            return;
        }
        RandomAccessFile raf = null;

        try {
            raf = new RandomAccessFile(plikZDanymi, "rw");
            raf.seek(0);
            while (raf.getFilePointer() < raf.length()) {
                String login = raf.readUTF();
                String haslo = raf.readUTF();
                String pin = raf.readUTF();
                String numer = raf.readUTF();
                double stan = raf.readDouble();
                konta[iloscKont] = new Konto(login, haslo, pin, numer, stan);
                iloscKont++;

                if (raf.getFilePointer() == raf.length()) {
                    koniecPliku = raf.getFilePointer();
                }
            }
        } finally {
            if (raf != null) {
                raf.close();
            }
        }
    }

    public String getPlikZDanymi() {
        return plikZDanymi;
    }

    public long getKoniecPliku() {
        return koniecPliku;
    }

    public void setKoniecPliku(long koniecPliku) {
        this.koniecPliku = koniecPliku;
    }

    public int getIloscKont() {
        return iloscKont;
    }

    public void setIloscKont(int iloscKont) {
        this.iloscKont = iloscKont;
    }

Klasa PrzebiegProgramu

import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Random;
import java.util.Scanner;

public class PrzebiegProgramu {

    Scanner scanner = new Scanner(System.in);
    WczytanieDanych dane = new WczytanieDanych();
    int iloscKont;
    Konto[] konta;
    long koniecPliku;
    String nazwaPliku;

    public void start() throws IOException {
        int a;
//        do {
            nazwaPliku = dane.getPlikZDanymi();
            konta = dane.getKonta();
            iloscKont = dane.getIloscKont();
            koniecPliku = dane.getKoniecPliku();
            System.out.println("1 - Zaloguj się");
            System.out.println("2 - Zarejestruj się");
            System.out.print("Wybierz opcję: ");
//            a = scanner.nextInt();
//            switch (a) {
//                case 1:
//                    logowanie();
//                    break;
//                case 2:
//                    rejestracja();
//                    break;
//            }
//        } while(a != 0);
    }

0

Gdzie wywołujesz metodę wczytaj?

0
Karaczan napisał(a):

Gdzie wywołujesz metodę wczytaj?

Zapomniałem wpisać tą klasę, ale wywołuje wszystko w głównej klasie main

import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {

        WczytanieDanych wczytanie = new WczytanieDanych();
        wczytanie.wczytaj();
        PrzebiegProgramu przebieg = new PrzebiegProgramu();
        przebieg.start();
    }
}
1

Tworzysz dwie różne instancje klasy WczytanieDanych: jedną w Main a drugą w PrzebiegProgramu.

1

Uwagi poza doraźnym błędem:

  1. setter setIlosc to kryminał. Inne settery, na ile je rozumiem, też są podejrzane, czy szkodliwe.

  2. zmień konta na np List<Konto> a getIlosc niech zwraca ilość obiektów w tej liście

  3. Zacznij zmieniać swoje myślenie z proceduralnego na obiektowe. Dla mnie nazwa klasy 'wczytanie danych' jest proceduralna. Sugerował bym zmianę na 'Magazyn kont' lub 'Repozytorium kont' lub coś takiego. Słowa są ważne, za nimi idzie myślenie. Oczywiście za słowami idzie rozwijanie kodu w stosownym myśleniu.
    Na szkolnym poziomie OOP się obrazuje, że obiekt (więc i klasa) to rzeczownik, a metoda to czasownik

  4. zmienne w PrzebiegProgramu jak

int iloscKont;
    Konto[] konta;
    long koniecPliku;
    String nazwaPliku;

zrobiłeś w błędnym myśleniu. Właśnie takie rzeczy powinny być 'sprywatyzowane' w klasie z p. 3.

  1. zagadnienie projektowe, w scenariuszu, że program żyje długo.
    Plik otwierasz tylko na czas wczytania, po czym m.in. pamiętasz jego długość. Gdyby plik został zaktualizowany z innego stanowiska, długośc jest nieaktualna, i mylącej zmiennej pamiętać nie należy. Realna klasa BazaDanych by trzymała plik otwarty przez cały czas, po pierwsze dla szybkości, po drugie, aby ktoś świni nie podłożył

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