Java XML设计布尔标志和值

时间:2015-02-03 21:41:35

标签: java xml jaxb flags

以下是我当前的XML文件。

<book>
    <isWritable>true</isWritable>
    <writeDelay>4.0</writeDelay>

    <isReadable>true</isReadable>
    <readDelay>3.2</readDelay>

    <isDestroyed>false</isDestroyed>
</book>

我有

3个布尔标志 - isWritable,isReadable,isDestroyed。

2个值writeDelay,readDelay。

条件

isWritable需要writeDelay

isReadable需要readDelay

您可以是isDestroyed但不是isWritable或isReadable

您可以是isWriteable和isReadable

您可以是isWritable或isReadable

当前的实施:

Book.class具有所有这些必填字段。我正在寻求简化这一点。

如果我的书可读但不可写。 XML文件应该只是:

<book>
    <isReadable>true</isReadable>
    <readDelay>3.2</readDelay>
</book>

同样如果这本书被销毁了。 XML应该只是:

<book>
    <isDestroyed>true</isDestroyed>
</book>

是否有适用于我的情况的现有设计模式?我已经看了几个并且倾向于多态但是想要伸手去看看是否还有其他模式我还没有考虑过。

多态性:这是我的想法,但对我而言,它似乎只是一个布尔值和值。

类名为bookDescription。

子类:writeDescription,readDescription,writeAndReadDescription(writeDescription的子类),destroyedDescription。

任何意见和建议将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:1)

我会建议XML属性。在检查Java与XML时,这个问题非常普遍,因为与属性相比,元素往往更加具体。

以下是关于属性目的的详细解读:https://stackoverflow.com/a/420197/2958086

我们正在描述这本书的属性,而不是书本身的内容。

在这种情况下,您可以这样做:

<book isWritable="true" isReadable="true" writeDelay="4.0" readDelay="3.2" isDestroyed="false"/>

然后你可以快速拉出属性,并假设没有属性意味着错误。

但是,您实际上提供了5个数据,但2个数据依赖于其他2个数据:

  

isWritable:writeDelay

     

isReadable:readDelay

因为您根据其他字段指示需要writeDelay和readDelay,所以可以提高效率:

<book writeDelay="4.0" readDelay="3.2" isDestroyed="false"/>

只读书:

<book readDelay="3.2"/>

一本被破坏的书:

<book isDestroyed="true"/>

然后,您可以使用writeDelayreadDelay变量来处理布尔值。如果未提供,则可以假设其关联值为false。

这也允许您的XML对SAX友好,因为所有重要的属性都是与元素本身一起提供的,而不一定是在解析中。您可以根据属性轻松验证单个节点,而不是节点及其子节点。

然而,正如您所描述的那样,Java对象很好。为了清晰和实际的程序化使用,您应该将所有这5个值保留在那里。在这种情况下,XML专门用于存储数据,而应用程序则解释存储的数据。

答案 1 :(得分:0)

对于此特定用例,您可以创建仅用于对象/ XML转换的Book类的单独版本。此类将具有对象数据类型属性(即Boolean而不是boolean),因此空值不会转换为XML。然后,您可以将所有逻辑封装到转换器类中。