Java习惯用法定义匹配CFG的调用模式

时间:2011-07-08 16:27:31

标签: java idioms

假设一个简单的类似XML的文档格式,带有两个终端元素和一个递归嵌套元素....假设目标是使用Java类型系统构造字符串,以允许新的(语法上有效的)文档被定义为干净利落尽可能使用Java。我正在设想一个可以隐藏在类库中的基类 - 然后将各个文档的定义尽可能直观和整洁。

暂时忽略递归嵌套元素 - 这段代码代表了一种可行的方法: -

public class StaticDocument {
  private StringBuilder doc;
  protected StaticDocument() {}
  protected void nonNestedA() { doc.append("<A/>"); }
  protected void nonNestedB() { doc.append("<B/>"); }
  public String toString() { return doc.toString(); }
}

使用StaticDocument作为基类,可以仅使用Java定义文档来描述其抽象结构。具有A和B元素顺序组合的示例文档: -

public class ExampleDocument extends StaticDocument
{
  public ExampleDocument()
  {
    nonNestedA();
    nonNestedB();
    nonNestedA();
  }
}

当尝试扩展这种方法以包含递归嵌套元素时,事情会变得复杂一些....在C ++中我可能使用了受保护的StaticDocument内部类来定义Z元素 - 然后使用封闭块ExampleDocument确保每个都与a匹配 - 采用RAII习语/模式。在C#中,我可以利用IDisposable接口和“使用”到类似的目的。另一种可能性是将参数传递给nestedZ方法并使该参数封装执行生成由Z元素包围的文档...但这有点麻烦 - 特别是因为Java(6)不支持委托或lambda表达本身。

[旁白:我知道像JaxB for XML这样的工具......我可以将XML文件嵌入到jar中 - 但这里的问题是为了捕获更复杂的目标 - XML只展示了相同的抽象结构]

所以...最后......问题:Java社区是否就解决这类问题的最佳方法达成了共识?目标是在构建文档期间最小化无关的中间对象 - 并且尽可能将文档构造为紧凑和“自然”(即易于识别为匹配相应的XML文档)。

我有兴趣听一些专家意见......和/或相关文章的指示。

2 个答案:

答案 0 :(得分:2)

您可以使用builder design pattern并创建可嵌套的构建器,其中fluent interface代表您所需的结构。

This examples使用它们来创建测试数据对象。但它也适用于您的场景。

答案 1 :(得分:0)

如何使用XStream来获取域对象并将其序列化为XML?