объединение typedef в Java

1

Я пытаюсь прочитать блок в текстовых простых данных и отделить это в соответствующих атрибутах в структуре.

Как код 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?

  • 0
    Формат даты является лишь примером, реальная проблема заключается в том, чтобы проанализировать большую строку для нескольких определенных полей
Теги:
groovy
union

2 ответа

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

В 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'
  • 1
    Вы также можете использовать def isoDate = df.withTraits ISODate
  • 0
    @tim_yates верно, но в этом случае я думаю, что это более читабельно с «только одной чертой» - как, по сути, это конверсия
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню