2013-08-16 62 views
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,这是相当不令人满意的实现。填充方法需要知道我们是否期望使用findStringData方法或findBooleanData方法。

有没有更好的方法来做到这一点?我是过于挑剔,因为填充方法需要知道什么样的DataFinderInterface实例分配到哪个字段呢?

+2

我不知道这是否只有我,但你的问题不是很清楚。这看起来像[XY问题](http://meta.stackexchange.com/q/66377/196975)。可能你应该先解释你的问题陈述。你想要做什么,然后你现在拥有什么。 –

+0

填充也需要能够设置'str2','str3'和'bool2'? –

回答

1

findData方法返回一个String应该是足够的:即处理Booleans代码可以把呼叫Boolean.getBoolean()在它的上面:

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

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

1

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

如果您必须使用上述模式,您可能需要考虑让MyData保持AtomicRefernce<String>AtomicReference<Boolean>。然后有getSettableStringgetSettableBoolean方法返回适当的引用,如果不匹配则返回null。

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); 
}