在java中使用union typedef

时间:2015-03-04 15:46:48

标签: java groovy union

我正在尝试读取文本明文数据中的块,并将其与结构中的相应属性分开。

类似于clasic示例的C / C ++代码:

typedef struct {
        char yyyy[4],
        char mm[2],
        char dd[2]
} ISO;

typedef struct {
        char dd[2],
        char mm[2],
        char yyyy[4]
} JAPAN;

typedef struct {
        char mm[2],
        char dd[2],
        char yyyy[4]
} USA;

typedef union  {
        char  date[8],
        ISO   iso_date,
        JAPAN japan_date,
        USA   usa_date
} date_format;

/////
char date[8] = "20150304";
date_format format = (date_format)date;
printf("%s\n", format->iso_date->yyyy);

如何用Java或groovy表示这个?

2 个答案:

答案 0 :(得分:1)

1)Java没有结构。

但你可以使用像

这样的类
class ISO {
    public char yyyy = new char[4];
    public char mm = new char[2];
    //etc..
}

2)用类层次结构替换联合

abstract class DateFormat {
    abstract Object getObj();
}

class uISO extends DateFormat {
    ISO iso = new ISO();
    public Object getObj() { return obj; }
}

以及其他结构。

答案 1 :(得分:1)

在groovy中(如在Java中)没有这样的构造,因为设计目标之一是防止开发人员摆弄内存块。所以你必须想出一些方法来将它包装在类/接口中。以下是使用groovy trait s:

的示例
// just to have the base for the functions
interface ConcreteDate {
    String getDateChunk()
    String getDay()
    String getMonth()
    String getYear()
}

// actual implementation for ISO
trait ISODate implements ConcreteDate {
    String getYear() { dateChunk[0..3] }
    String getMonth() { dateChunk[4..5] }
    String getDay() { dateChunk[6..7] }
}

// the container, that holds the information
@groovy.transform.Immutable
class DateFormat {
    String dateChunk
}

def df = new DateFormat('20150303')
def isoDate = df as ISODate // cast the object to the trait
assert isoDate.year == '2015'
assert isoDate.month == '03'
assert isoDate.day == '03'