提取布尔值或字符串的接口

时间:2013-08-16 15:08:03

标签: java software-design

所以我有一个数据类,它有点像:

class MyData {
  String str1,str2,str3;
  Boolean bool1,bool2;
}

将根据String输入填充属性,如:

public void populate(String s) {
  if(s.contains("somevalue") myData.setStr1("xxx");
  if(s.constains("something else") myData.setBool1(true);
  else myData.setBool1(false);
}

这当然是一种非常可怕的做法,因为s.contains实际上是一些非常多毛的条件,所以我定义了一个界面:

public interface DataFinderInterface {
    public String findStringData(final String input);
    public Boolean findBooleanData(final String input);
}

因此,populate方法可以重写为:

public void populate(String s) {
  myData.setStr1(str1Finder.findStringData(s));
  myData.setBool1(bool1Finder.findBooleanData(s);
}

此接口的实现要么定义findStringData,要么定义findBooleanData,这是非常不满意的。 populate方法需要知道我们是否期望使用findStringData方法或findBooleanData方法。

有更好的方法吗?我是否过于挑剔,因为populate方法需要知道DataFinderInterface的哪个实例分配给哪个字段?

4 个答案:

答案 0 :(得分:1)

上述(或其中一个问题)的问题在于,您始终在呼叫setStr1setBool1,我认为您也会调用所有其他问题。

如果您必须使用类似上述模式的内容,您可能需要考虑让MyData暂停AtomicRefernce<String>AtomicReference<Boolean>。然后使用getSettableStringgetSettableBoolean方法返回相应的引用,如果不匹配则返回null。

答案 1 :(得分:1)

返回findData的单个String方法就足够了:处理Booleans的代码可以在其上调用Boolean.getBoolean()

public interface DataFinderInterface {
    public String findData(final String input);
}
...
myData.setBool1(Boolean.getBoolean(bool1Finder.findData(s));

答案 2 :(得分:0)

如果只是接口方法签名,您担心这可以使用泛型来解决。然而,从字符串中初始化对象似乎有点奇怪。也许如果您添加有关您要解决的问题的更多详细信息,可能会有更好的解决方案。

public interface DataFinder<T> {
    public T findData(final String input);
}

DataFinder<String> str1Finder = new ... // a class implementing DataFinder<String>
DataFinder<Boolean> bool1Finder = new ... // a class implementing DataFinder<Boolean>

public void populate(String s) {
  myData.setStr1(str1Finder.findData(s));
  myData.setBool1(bool1Finder.findData(s);
}

答案 3 :(得分:-1)

考虑使用正则表达式从输入字符串中提取所需的数据。我将MyData类保留为一个简单的数据容器,并构建一个单独的类来填充它 - 例如,MyDataBuilder。这个类可以使用字符串匹配来提取字段并在对象上填充它们。