在Java中我想创建一个数据类型,比如Atom,它包含一个索引号,当该索引= 0时,Atom将包含一个String数据,否则Atom只是一个索引(整数)。 / p>
我该怎么做?
如果大多数Atoms只是索引而且只有一些包含字符串,我想它会节省一些空间。
答案 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”类型。如果您定义一个包含int
和String
的类,则会分配int
和String
引用的空间,从而无法节省空间你想要实现的目标。
您可以将“atoms”存储为java.lang.Object
值,但每次需要获取索引或字符串时,都需要检查它们的类型和转换。这种方法很麻烦,因为原始int
包含在java.lang.Integer
个对象中,增加了存储要求。
更简洁的方法是为Atom
定义一个界面,并定义两个类,StringAtom
和IntAtom
,以便在程序中存储两种原子:
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数据(表示索引为零)。