Как ссылаться на экземпляры класса в методах Java для базового текстового инвентаря игры?

Я пытаюсь сделать текстовую игру на Java. Я придумал очень простой текстовый инвентарь и несколько методов: один для добавления нового элемента при его обнаружении, один для его удаления при использовании и третий для открытия самого инвентаря. Раньше я ссылался на элементы в виде строк, но мне также нужно было описание и «найденное» логическое значение, чтобы вызвать некоторые варианты выбора, поэтому я решил преобразовать их в объекты.

Для контекста: мой инвентарь — это ArrayList, так как мне нужно было динамическое решение для добавления потенциальных предметов на ходу.

Моя проблема: когда я пытаюсь сослаться на имя «элемента», я получаю значение последнего созданного мной элемента, а не того, который я указал в методе «addItem()».

//My class, for reference:

public class Item {

static String name;
static String description;
static boolean isOwned = false;

public Item(String name, String description, boolean isOwned) {
    this.name = name;
    this.description = description;
    this.isOwned = isOwned;
}

public static String getName() {
    return name;
}

public static String getDescription() {
    return description;
}

public static boolean isOwned(boolean owned) {
    if (owned) {
        isOwned = true;
    } else if (!owned) {
        isOwned = false;
    }
    return isOwned;
}

Вот методы, которые я создал для инвентаризации:

public static void addItem(Item obj) {
    inventory.add(Item.name);
    if (!startScreen) { //This is to prevent the method from printing out an
//output in the start screen, while doing some background "addItem()" processes.

        System.out.println("-------------------------------------------");
        System.out.println("\n> You have a new item: " + Item.name + ".");
        Item.isOwned(true);
    }
}

public static void removeItem(Item obj) {
    inventory.remove(Item.name);
    System.out.println("-------------------------------------------\n");
    System.out.println("> " + Item.name + " used.");
}

public static void openInventory() {
    System.out.print("> Your inventory: |");
    for (String item : inventory) {
        System.out.print(" " + item + " | ");
    }
    System.out.println("-------------------------------------------\n");
    System.out.println("> To use an item, please type the exact name."
            + "\n> Type 'X' to close the inventory.");

    String interact = in.

        if (interact.equals("x")) {
            break;
        }
    }

}

Теперь предположим, что я создал два элемента, но хочу добавить только первый:

static Item sealedLetter = new Item(
    "Sealed Letter", //name
    "A letter from a desperate man to his beloved. It holds many secrets.", //description
    false); //'Found' State

static Item musicSheet = new Item(
    "Music Sheet", //name
    "A music sheet holding a melancholic melody in D minor. Someone might appreciate its gloomy tune.", //description
    false); //'Found' State

addItem(sealedLetter);

По какой-то причине мой вывод будет таким и будет относиться только к последнему созданному элементу:

«У вас есть новый предмет: Нотный лист».

Как вы увидите, я пытался ссылаться на переменные элементов и отдельные объекты внутри методов, но, похоже, это не сработало. Очевидно, что создавать метод для каждого предмета в инвентаре не функционально и неэффективно, хотя это, конечно, решило бы проблему. Что я делаю не так? Я не использую правильный параметр для ссылки на объект?

Я уверен, что эта моя проблема может помочь некоторым людям, которые хотят реализовать аналогичную и лучшую систему, чем моя — если я смогу заставить ее работать, конечно!


person Antonino Lupo    schedule 17.07.2018    source источник
comment
static String name; - статический означает, что будет только один из них. Каждый раз, когда вы меняете значение name, будут меняться все значения.   -  person Scary Wombat    schedule 17.07.2018
comment
На самом деле, похоже, что все статично, ваши поля, ваши методы, все. Пора изучить и применить принципы объектно-ориентированного программирования, прежде чем делать что-либо еще, включая эту программу. Найдите достойную книгу, например Head First Object-Oriented Analysis and Design.   -  person Hovercraft Full Of Eels    schedule 17.07.2018
comment
Эй, страшный вомбат! Спасибо за совет; Ранее я пытался удалить статическое ключевое слово, но получаю ошибку ссылки в своем основном методе, утверждающую, что я не могу ссылаться на нестатическую переменную из статического контекста. Есть ли обходной путь для этого? Потому что я верю, что это решит мою проблему! РЕДАКТИРОВАТЬ: Кроме того, спасибо за ваше предложение, Hovercraft! Я загляну в эту книгу, как только смогу.   -  person Antonino Lupo    schedule 17.07.2018
comment
попробуйте поискать сообщения об ошибках, которые вы получаете, и вы найдете тысячу ответов stackoverflow.com/questions/2559527/   -  person Scary Wombat    schedule 17.07.2018
comment
Вы решили эту проблему, но в обратном порядке. Решение состоит не в том, чтобы сделать все статичным, а в том, чтобы научиться создавать экземпляры и создавать их. Опять же, это все базовые объектно-ориентированные концепции, концепции, которые вам действительно понадобятся, если вы хотите двигаться вперед каким-либо разумным образом.   -  person Hovercraft Full Of Eels    schedule 17.07.2018
comment
В методе addItem(Item obj) {...} метод принимает Item (имя локальной переменной obj). Но в методе, о котором вы говорите, Item.name должно быть obj.name.   -  person prasad_    schedule 17.07.2018