Есть ли в Java динамические переменные для членов класса? - PullRequest
4 голосов
/ 08 апреля 2010

Мне интересно, возможно ли создание динамических переменных в Java. Другими словами, переменные, которые меняются в зависимости от моих инструкций.

РЕДАКТИРОВАТЬ Перефразируя мой вопрос, я имею в виду переменные для класса, тип которых изменяется в зависимости от заданной переменной (stockType, для тех, кто читает).

К вашему сведению, я делаю торговую программу. У данного торговца будет множество предметов для продажи по разным ценам.

Динамизм, к которому я призываю, проявляется потому, что каждая категория предметов для продажи имеет свои собственные свойства. Например, элемент книги имеет два свойства: int pages и boolean hardCover. Напротив, элемент закладки имеет одно свойство - шаблон String.

Вот фрагменты кода, чтобы вы могли увидеть, что я пытаюсь сделать:

public class Merchants extends /* certain parent class */ {
        // only 10 items for sale to begin with
        Stock[] itemsForSale = new Stock[10]; 

        // Array holding Merchants
        public static Merchants[] merchantsArray = new Merchants[maxArrayLength];

        // method to fill array of stock goes here
}

и

public class Stock {
    int stockPrice;
    int stockQuantity;
    String stockType; // e.g. book and bookmark
    // Dynamic variables here, but they should only be invoked depending on stockType
    int pages;
    boolean hardCover;
    String pattern;
}

Ответы [ 6 ]

5 голосов
/ 08 апреля 2010

Возможно, вы захотите использовать полиморфизм.

public class Stock {
    int stockPrice;
    int stockQuantity;
    int stockType;
}

public class Book extends Stock{
    int pages;
    boolean hardcover;
}

public class Bookmark extends Stock {
    String pattern;
}
5 голосов
/ 08 апреля 2010

Подкласс ваш Stock для каждого типа акций:

public class Stock {
    private int price;
    private int quantity;
}

public class StockBook extends Stock {
    private int pages;
    private boolean hardCover;
}

public class StockBookmark extends Stock {
    private String pattern;
}

Или используйте Map для различных типов атрибутов:

public class Stock {
    private int price;
    private int quantity;
    private String classification; // e.g. book and bookmark
    private Map properties = new HashMap();
}
3 голосов
/ 08 апреля 2010

Java не позволяет динамические переменные. Вместо этого вам следует применять методы объектно-ориентированного проектирования.

В этом случае вы должны определить абстрактный класс Запас с помощью общих методов и членов и расширить этот класс для типов: Книга , Закладка и т. Д. См. Пример ниже.

Преимущества использования абстрактного класса для Stock (который пока не показан ни в одном другом ответе) состоят в том, что элемент «Stock» не может существовать сам по себе. Не имеет смысла иметь 5 акций на полке продавца так же, как имеет смысл иметь 5 книг на полке продавца.

public abstract class Stock {
    private int stockPrice;
    private int stockQuantity;

    // Implement getters and setters for stockPrice and stockQuantity.
}

public class Book extends Stock {
    // Since I'm extending Stock, I don't have to redefine price or quantity
    private int pages;
    private boolean hardCover;

    // Implement getters and setters for pages and hardCover.
}

public class Bookmark extends Stock {
    private String pattern;

    // Implement getters and setters for pattern.
}

Обратите внимание, что для того, чтобы определить, с каким типом объекта вы имеете дело позже, , если вам абсолютно необходимо , вы будете использовать проверки вроде:

if (myStock instanceof Book) { ... }
1 голос
/ 08 апреля 2010

НЕТ и не зря.

В любом случае делать то, что вы хотите, вместо того, чтобы иметь StockType, Subclass Stock на различные типы, которые вы хотите.

Приведите примеры того, что вы хотите сделать с динамическими переменными, и мы покажем вам, как это сделать.

Также не используйте массивы. Они имеют фиксированную длину и только на C ++. Вместо этого используйте List.

Заменить Stock[] itemsForSale = new Stock[10]; на List<Stock> itemsForSale = new ArrayList<Stock>(); и прочитать о List

0 голосов
/ 08 апреля 2010

Вы можете использовать шаблон фабричного дизайна здесь. Причина в том, что на основе stockType вы хотите, чтобы объект был специфическим / динамическим, который фабрика предоставит вам.

0 голосов
/ 08 апреля 2010

Я не уверен, что именно вы хотите, но похоже, что State design-pattern может быть чем-то для вас проверенным.

...