Java中可变大小的数据类型?

时间:2014-12-08 16:20:47

标签: java data-structures types

在Java中我想创建一个数据类型,比如Atom,它包含一个索引号,当该索引= 0时,Atom将包含一个String数据,否则Atom只是一个索引(整数)。 / p>

我该怎么做?

如果大多数Atoms只是索引而且只有一些包含字符串,我想它会节省一些空间。

3 个答案:

答案 0 :(得分:3)

以下工厂模式说明了静态工厂方法createAtom如何使用不同的数据创建不同类(所有Atom)的实例。

这里我将索引final更改为0,不会更改对象的类。此外,Atom必须提供对可选数据的访问。

public class Atom {
    public final int index;

    private Atom(int ix) {
        this.index = ix;
    }

    public String getDatum() {
        return null;
    }

    public static Atom createAtom(int index) {
        return index != 0 ? new Atom(index) : new ExtendedAtom(index);
    }
}

class ExtendedAtom extends Atom {
    private String datum;

    ExtendedAtom(int ix) {
        super(ix);
    }

    @Override
    public String getDatum() {
        return datum;
    }

}

答案 1 :(得分:2)

没有办法像这样创建一个类,因为Java不支持“union”类型。如果您定义一个包含intString的类,则会分配intString引用的空间,从而无法节省空间你想要实现的目标。

您可以将“atoms”存储为java.lang.Object值,但每次需要获取索引或字符串时,都需要检查它们的类型和转换。这种方法很麻烦,因为原始int包含在java.lang.Integer个对象中,增加了存储要求。

更简洁的方法是为Atom定义一个界面,并定义两个类,StringAtomIntAtom,以便在程序中存储两种原子:

interface Atom {
    boolean hasInt();
    boolean hasString();
    int getInt();
    String getString();
}
class StringAtom implements Atom {
    private final String s;
    public StringAtom(String s) {this.s = s;}
    boolean hasInt() {return false;}
    boolean hasString() {return true;}
    int getInt() {throw new IllegalStateException();}
    String getString() {return s;}
}
class IntAtom implements Atom {
    private final int n;
    public IntAtom(int n) {this.b = b;}
    boolean hasInt() {return true;}
    boolean hasString() {return false;}
    int getInt() {return n;}
    String getString() {throw new IllegalStateException();}
}

答案 2 :(得分:0)

使用索引成员变量创建一个小类,检查该索引是否为零的标志以及仅当标志为真时指示非空的String数据(表示索引为零)。