gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:10:37 25 4
gpt4 key购买 nike

我有以下代码:

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) {..}

然后在使用 if 语句确定哪个字段具有值时,用 null 调用它以获取未知字段。但是还有其他更优雅的方式吗?

最佳答案

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

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

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

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

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

关于java - 如何减少采用 1 个不同类型参数的多种方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31300238/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com