[英]Data type of variable size in Java?
在Java中,我想創建一個數據類型,比如說Atom,它包含一個索引號,並且當該索引= 0時,Atom將包含一個String數據,否則Atom只是一個索引(整數)。
我怎樣才能做到這一點?
我想如果大多數Atom只是索引而只有一些包含Strings,它將節省一些空間。
以下工廠模式說明了靜態工廠方法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;
}
}
由於Java不支持“聯合”類型,因此無法創建這樣的單個類。 如果用int
和String
定義一個類,則將為int
和對String
的引用分配空間,這將int
您要實現的節省空間的目的。
您可以將“原子”存儲為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();}
}
創建一個帶有索引成員變量的小類,一個標志檢查該索引是否為零,以及僅當標志為真(指示索引為零)時,字符串數據才為非空。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.