0

所以我有一个数据类,它有点布局为:

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

属性将根据字符串输入来填充,例如:

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 方法。

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

4

4 回答 4

1

上述问题(或其中一个问题)是你总是打电话给setStr1AND setBool1,我假设你也会打电话给所有其他人。

如果您必须使用类似上述模式的东西,您可能需要考虑使用MyDataholdAtomicRefernce<String>AtomicReference<Boolean>. 然后具有返回适当引用getSettableStringgetSettableBoolean方法,如果不匹配,则返回 null。

于 2013-08-16T15:13:55.750 回答
1

一个findData返回 a 的方法String就足够了:进程的代码Booleans可以调用Boolean.getBoolean()它:

public interface DataFinderInterface {
    public String findData(final String input);
}
...
myData.setBool1(Boolean.getBoolean(bool1Finder.findData(s));
于 2013-08-16T15:14:05.290 回答
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);
}
于 2013-08-16T15:49:35.710 回答
-1

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

于 2013-08-16T15:13:35.437 回答