我有几个xml文件,后来用java / gwt定义了我的GUI表示。 例如:
<?xml version="1.0" encoding="UTF-8"?>
<master>
<search-field>ExternalIdentifier</search-field>
<search-field>Name</search-field>
<attribute allowDisableSearchId="MasterExternalIdentifier">ExternalIdentifier</attribute>
<attribute allowDisableSearchId="MasterName">Name</attribute>
</master>
在这种特殊情况下,我想让用户选择通过复选框来取消/激活对特定列的搜索。为了识别这些字段,我想给它们一个唯一的标识符(这里有属性allowDisableSearchId)。使用此ID,可以预选(甚至不选择)此复选框。
问题是,当我设置我可能会监督的名称时,唯一的名称已经在其他文件中提供了。 除此之外,如果我想概述存在哪些唯一ID(例如设置首选项),我需要搜索所有xml文件以获取此属性。
现在,我想知道是否有像我在java中定义枚举这样的技术,并通过枚举值设置值。 例如,枚举:
public enum ALLOWDISABLESEARCHID {
MasterExternalIdentifier,
MasterName
}
然后在xml中使用
<?xml version="1.0" encoding="UTF-8"?>
<master>
<search-field>ExternalIdentifier</search-field>
<search-field>Name</search-field>
<attribute allowDisableSearchId="ALLOWDISABLESEARCHID.MasterExternalIdentifier">ExternalIdentifier</attribute>
<attribute allowDisableSearchId="ALLOWDISABLESEARCHID.MasterName">Name</attribute>
</master>
有了这个,我可以肯定它是唯一的,以后可以在java代码中引用它们。
或者我可以使用其他一些技术吗?
答案 0 :(得分:1)
enum的想法不会断言唯一性。我会写一个Test,它读取/src/main/resources/.../下的每个xml并解析所有属性值。 当'allowDisableSearchId'被多次使用时,测试应抛出异常。
package stackoverflow;
import static java.util.Arrays.asList;
import static java.util.Collections.singletonList;
import java.io.InputStream;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.junit.Test;
public class FindDuplicateId
{
@Test
public void idsAreUnique() throws Exception
{
final Set<String> ids = new HashSet<>();
for (final InputStream xml : findAllXml())
{
for (final String id : readIds(xml))
{
if (!ids.add(id))
{
throw new IllegalStateException("Duplicate ID " + id);
}
}
}
}
List<InputStream> findAllXml()
{
// TODO implement correct
return singletonList(this.getClass()
.getResourceAsStream("a.xml"));
}
List<String> readIds(final InputStream xml)
{
// TODO implement correct
return asList("MasterExternalIdentifier", "MasterName", "MasterExternalIdentifier");
}
}