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

时间:2015-07-08 18:00:08

标签: 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 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语句确定哪个字段具有值。但还有另一种更优雅的方式吗?

2 个答案:

答案 0 :(得分:7)

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

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

您可能想要考虑做的一件事是将“确实存在”的部分分离成自己的机制:

public final Optional<MyObj> byId(Long id) {
    return Optional.ofNullable(dataAccessObject.findById(id));
}

所以不要说service.doesExistById(123),而是说service.byId(123).isPresent()。这在语义上表示相同的含义,但它被分成单独的部分,这意味着您可以将byId()byName()等用于需要实际对象的其他目的,而不仅仅是知道是否它存在。

答案 1 :(得分:-2)

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