Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何减少使用1个不同类型参数的多个方法?_Java - Fatal编程技术网

Java 如何减少使用1个不同类型参数的多个方法?

Java 如何减少使用1个不同类型参数的多个方法?,java,Java,我有以下代码: public final boolean doesExistById(Long id) { return dataAccessObject.findById(id) != null; } public final boolean doesExistByName(String name) { return dataAccessObject.findByName(name) != null; } public final boolean doesExistByDi

我有以下代码:

public final boolean doesExistById(Long id) {
    return dataAccessObject.findById(id) != null;
}

public final boolean doesExistByName(String name) {
    return dataAccessObject.findByName(name) != null;
}

public final boolean doesExistByDisplayName(String displayName) {
    return dataAccessObject.findByDisplayName(displayName) != null;
}

public final boolean doesExistByWebId(String webId) {
    return dataAccessObject.findByWebId(webId) != null;
}
我的
Product
类具有属性
id、name、displayName、wedId

dataAccessObject.findBy___;()
返回类型为
Product
的对象(如果可以在数据存储中找到),或
null
的对象(如果不能找到)

如果可能的话,我想减少这段代码,因为我有许多对象需要上面的
doesExist()
模式。客户端代码将只知道其中一个属性


我想到的一个可能的解决办法是:

public final boolean doesExist(Long id, String name, String displayName, String webId) {..}

然后用
null
调用未知字段,同时使用
if
语句确定哪个字段有值。但是还有其他更优雅的方法吗?

您可以编写一个采用对象类型的方法 我建议你看看这个页面。

您认识到所有这些方法的“确实存在”部分完全相同,因此您希望避免重复,但这些方法的“ByXxx”部分完全不同

你所拥有的远比你想做的要好。请不要将方法签名更改为要求调用者为除一个参数外的所有参数提供空值。这是非常容易出错的,因为它不会为人们可能错误地使用方法签名的各种不同方式提供编译时错误

你可能要考虑的一件事是把“确实存在”的一部分分解成它自己的机制:

public final Optional<MyObj> byId(Long id) {
    return Optional.ofNullable(dataAccessObject.findById(id));
}
公共最终可选字节id(长id){
返回可选的.ofNullable(dataAccessObject.findById(id));
}

因此,与其说是
service.doesvistbyid(123)
,不如说是
service.byId(123).isPresent()
。这在语义上表示相同的含义,但它被分成不同的部分,这意味着您可以重用
byId()
byName()
,等等,用于需要实际对象的其他目的,不仅仅是为了知道它是否存在。

我认为你已经拥有的东西很好,而且看起来最干净。我认为你不能让它变得更好。即使是反射也不能使这变得更简单。通过将这些方法组合在一起,您想要保存什么
DoeSist(null,name,null,null)
DoeSistByName(name)
糟糕得多,而且由于您必须同时指定值和属性(即
id
name
displayName
,等等),您最好将属性嵌入到方法的名称中。@RobertBain您的假设是正确的。但是,调用这些方法的客户端代码并不总是知道所有字段(包括
id
),这就是为什么我必须将它们拆分的原因。谢谢大家的评论!我真的在想一个解决办法,但我想这是我能做的最远的了。我的建议是避免反思,除非必要。它在运行时很慢,并且违反了语言规则。您已经拥有的要好得多。这是如何回答OP提出的特定问题的?==NULL九个更多-->ActionNotFoundException这是一个很好的解决方案。它需要重写一些代码,但我认为以后会更好。谢谢