Java是否为类成员提供动态变量?

时间:2010-04-07 23:04:35

标签: java dynamic variables

我想知道是否可以在Java中创建动态变量。换句话说,变量会根据我的指示而变化。

编辑重新提到我的问题,我的意思是一个类的变量,它根据给定的变量更改类型(stockType,对于那些继续读取的人)。

仅供参考,我正在制作交易计划。给定的商家将有各种价格的待售物品。

我所要求的活力是因为每种待售物品都有自己的特性。例如,book项有两个属性:int pages和boolean hardCover。相反,书签项具有一个属性String pattern。

以下是代码的骨架片段,以便您可以看到我想要做的事情:

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 个答案:

答案 0 :(得分:5)

为每种股票类型对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();
}

答案 1 :(得分:5)

您可能需要考虑使用多态。

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;
}

答案 2 :(得分:3)

Java不允许动态变量。相反,您应该应用面向对象的设计技术。

在这种情况下,您应该使用常用方法和成员定义抽象类 Stock ,并为类型扩展该类:预订书签等。请参阅下面的示例。

使用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) { ... }

答案 3 :(得分:1)

并且有充分的理由。

无论如何要做你想要的而不是将stockType,Subclass Stock分成你想要的不同类型。

向我们举例说明您想要对动态变量做些什么,我们可以向您展示如何。

也不要使用数组。它们是固定的长度,只有像C ++一样。请改用List

Stock[] itemsForSale = new Stock[10];替换为List<Stock> itemsForSale = new ArrayList<Stock>();并阅读List

答案 4 :(得分:0)

我不确定你想要什么,但听起来像State design-pattern可能是你要检查的东西。

答案 5 :(得分:0)

您可以在此处使用factory design pattern。原因是,基于stockType,您需要一个工厂为您提供的特定/动态对象。