Keresés

Új hozzászólás Aktív témák

  • Szmeby
    tag

    Egy kis segítséget szeretnék kérni. A mellékelt txt részlet (recept) szerkezetet szeretném listába olvasni. (A receptek üres sor szeparáltak. Recipe osztály 1db arraylist példány változót tartalmaz.)
    Pancake dough
    60
    milk
    egg
    flour
    sugar
    salt
    butter

    Meatballs
    20
    ground meat
    egg
    breadcrumbs

    Tofu rolls
    30
    tofu
    rice
    water
    carrot
    cucumber
    avocado
    wasabi

    A tervem: string listába (part) tettem a sorokat és file üres sor esetén ezt a listát odaadtam a recepies listának, ami az osztályt tárolja. A gondom, hogy a part.clear(); hívással az átadott referencia is megszűnik. Hogy lehetne ez jól megoldani?

    public static ArrayList<Recipe> readRecordsFromFile(String fileName) {
        ArrayList<Recipe> listRecipes = new ArrayList<>();
        ArrayList<String> part = new ArrayList<>();
        try {
          Scanner file = new Scanner(Paths.get(fileName));
          while (file.hasNextLine()) {
            String[] str = file.nextLine().split(System.lineSeparator());
            if (str[0].equals("")) {
              listRecipes.add(new Recipe(part));
              part.clear();
            } else {
              part.add(str[0]);
            }
          }
          if (!part.isEmpty()) {
            listRecipes.add(new Recipe(part));
          }
        } catch (IOException ex) {
          Logger.getLogger(RecipeSearch.class.getName()).log(Level.SEVERE, null, ex);
        }
        return listRecipes;
      }

    A part referenciája nem szűnik meg, ha arra gondoltál. A belepakolt Stringeket a clear ugyan eltávolítja a listából, de a part él és virul. Egy referencia akkor szűnik meg, amikor semmilyen más élő objektum nem hivatkozik rá (mert mondjuk az utolsó hivatkozást is felülcsapod valami más referenciával).
    Na meg a vezérlés kifutott a scope-jából is, ami a part esetén a metódus kapcsos zárójelei között található. (Ha a while ciklus kapcsos zárójelei közé tennéd a part deklarációt, akkor az lenne az ő scope-ja és minden körben új példány készülne belőle, de azt most nem akarod.)

    A csoda a listRecipes.add(new Recipe(part)); soron történik, a part referenciáját megjegyzi a recipe ojjektum is - immáron nem csak a part változó fog arra hivatkozni -, az ő referenciáját pedig beledobjuk a listRecipes listába, így az már nem vész el addig, amíg a listRecipes létezik.

    Tehát a clear helyett bátran csinálhatsz egy új lista objektumot a part változódnak, sőt illene is, ha nem akarod piszkálni a régi lista tartalmát, ami már a listRecipes bugyraiban pihen.

Új hozzászólás Aktív témák