簡體   English   中英

Java中可變大小的數據類型?

[英]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不支持“聯合”類型,因此無法創建這樣的單個類。 如果用intString定義一個類,則將為int和對String的引用分配空間,這將int您要實現的節省空間的目的。

您可以將“原子”存儲為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();}
}

創建一個帶有索引成員變量的小類,一個標志檢查該索引是否為零,以及僅當標志為真(指示索引為零)時,字符串數據才為非空。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM