所以我有一个数据类,它有点像:
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的哪个实例分配给哪个字段?
答案 0 :(得分:1)
上述(或其中一个问题)的问题在于,您始终在呼叫setStr1
和setBool1
,我认为您也会调用所有其他问题。
如果您必须使用类似上述模式的内容,您可能需要考虑让MyData
暂停AtomicRefernce<String>
和AtomicReference<Boolean>
。然后使用getSettableString
和getSettableBoolean
方法返回相应的引用,如果不匹配则返回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。这个类可以使用字符串匹配来提取字段并在对象上填充它们。