0

我正在编写一组对象,它们应该能够更改Joda Time MutableDateTime 实例中的字段。

每个对象都按顺序应用到缓冲区,当应用所有对象时,将构建一个完整有效的 MutableDateTime。

每个实例都必须能够知道集合中的其他实例已经设置了哪些日期时间字段。

我被卡住了,因为我遇到了以下问题:

  1. 如何在所有日期时间字段中创建具有空值的 MutableDateTime 实例,以便将其用作要构建的初始值?
  2. 我怎么知道 MutableDateTime 的某些字段是否已设置?

MutableDateTime 在内部跟踪它在一个长实例字段中的数据,该字段初始化为从时代开始到现在经过的毫秒数。因此,它已将所有字段设置为某个值。

你知道 MutableDateTime 是否有一些空值的概念吗?

编辑:

正如我在回复中所展示的那样,我按照弗拉基米尔的建议使用管理器类开发了一个解决方案。

4

2 回答 2

1

您应该创建“经理”类来记住已经设置的字段。MutableDateTime如果用户在设置所有字段之前尝试检索实例,它应该抛出异常。

如果您始终设置所有字段,MutableDateTime则 [1] 并不重要(值将被覆盖)。

于 2012-05-06T09:25:04.690 回答
1

我终于改变了最初的设计,并完全按照 Vadim Ponomarev 的建议实现了它。由于 Joda 缓冲区中的每个字段类型都有相应的 DateTimeFieldType 实例,因此我使用私有 Set 对象来跟踪存在的字段。

下面的代码显示了我是如何完成的:

 private final Set<DateTimeFieldType> fieldTypes = Sets.newHashSet();

    /**
 * Allow to set to or reset one of the DateTimeFieldType fields 
 * @param fieldType the DateTimeFieldType field to change
 * @param value the value to set it
 */
    public void changeField(DateTimeFieldType fieldType, boolean value) {
        if (value)
            fieldTypes.add(fieldType);
        else
            fieldTypes.remove(fieldType);
    }

    /**
 * Check if one of the DateTimeFieldType is present in this set.
 * @param fieldType The field type to check for presence.
 * @return true if the DateTimeFieldType is present, otherwise false
 */
    public boolean isFieldSet(DateTimeFieldType fieldType) {
        return !fieldTypes.contains(fieldType);
    }

我还添加了一些实用方法,允许一次更改日期的所有字段和时间的所有字段。这在客户端编写代码以简化对日期字段集的常见操作时可能很有用。

/**
 * Allow to set the fields that build the time part
 * of a date time
 * <p/>
 *
 * @param value value to set the DateTime fields
 */
    public void changeTimeFields(boolean value) {

        changeField(DateTimeFieldType.hourOfDay(), value);
        changeField(DateTimeFieldType.minuteOfHour(), value);
    }


/**
 * Allow to set the fields that build the date part
 * of a date time
 * <p/>
 *
 * @param value value to set the DateTime fields
 */
    public void changeDateFields(boolean value) {
        changeField(DateTimeFieldType.dayOfMonth(), value);
        changeField(DateTimeFieldType.monthOfYear(), value);
        changeField(DateTimeFieldType.yearOfEra(), value);
    }

最后,我还添加了一些方法来查询是否设置了所有日期字段以及是否设置了所有时间字段:

/**
 * Allow to check if the DateTimeFieldType fields that build the 
 * date part of a datetime has been set in this instance.
 * <p/>
 *
 * @return true if date part has yet to be applied to
 * the instance, false otherwise
 */
    public boolean isDateSet() {
        return fieldTypes.contains(DateTimeFieldType.dayOfMonth()) &&
                fieldTypes.contains(DateTimeFieldType.monthOfYear()) &&
                fieldTypes.contains(DateTimeFieldType.yearOfEra());
    }

    /**
 * Allow to check if the DateTimeFieldType fields that build the 
 * time part of a datetime has been set in this instance.
 * <p/>
 *
 * @return true if time part has yet to be applied to
 * the instance, false otherwise
 */
    public boolean isTimeSet() {
        return fieldTypes.contains(DateTimeFieldType.minuteOfHour()) &&
                fieldTypes.contains(DateTimeFieldType.hourOfDay());

    }

我终于把它做成了一个 DateTimeFieldTypeSet 类。我认为它很好地封装了 Joda 类中缺乏的一个常见概念。我希望它也对其他人有用。

于 2012-05-06T10:34:02.313 回答