Я пытаюсь прочитать блок в текстовых простых данных и отделить это в соответствующих атрибутах в структуре.
Как код 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?
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; }
}
и т.д. для ваших других структур.
В 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'
def isoDate = df.withTraits ISODate