gpt4 book ai didi

java - 我怎样才能将这个可怕的具有多个泛型的抽象java类重构为 "better"?

转载 作者:行者123 更新时间:2023-12-01 18:10:11 29 4
gpt4 key购买 nike

我们的 JSF Web 应用程序中有多个具有类似功能的搜索页面:

  • 他们有搜索结果(将这些对象称为 T)
  • 有一个包含搜索条件的对象(将此对象称为 C)
  • 他们能够用名称保存搜索条件(将此对象称为 S)

所以这些都使用 JSF 页面支持 bean,它们都扩展了一个抽象类:

public abstract class AbstractSearch<T, C, S> implements Serializable {

例如:

public class FooSearch extends AbstractSearch<Foo, FooCriteria, FooSavedCriteria> 
implements Serializable {

我看到的问题之一是放入 T、C 和 S 的类不与另一个 T、C 或 S 类共享 superType。但他们确实有类似的方法。例如,所有 S 类型类都有一个“getName()”方法。我无法使用常见的父类(super class)来获取此名称。相反,我必须将以下方法放入 AbstractSearch 类中,并用它包装所有对象:

abstract String getNameFromSavedCriteria(S);

然后在各个子类中实现转换方法:

@Override
String getNameFromSavedCriteria(FooSavedCriteria criteria) {
return criteria.getName();
}

这是一种不好的做法吗?该页面上到处都是这些转换辅助方法。

另一个看起来很奇怪的编码的例子。这是 AbstractSearch 的典型公共(public)方法:

public void runSearch() {

if (simpleSearch == true) {
clearAdvancedSearchFields(); // abstract method
}

populateSearchFromForm(); // abstract method

try {
setResults(processRunSearch()); // abstract method
cacheResults(results); // abstract method
cacheSearch(search); // abstract method

if (getResults().isEmpty()) {
Messages.addGlobalWarn("No results found");
}

if (formAutoHide) {
searchFormVisible = getResults().isEmpty();
}

} catch (MyException ex) {
FacesUtils.addGlobalError(ex);
}
}

再说一次,这是一种不好的做法吗?有没有更好的方法来处理像这样的抽象类,它有很多通用功能,但没有很多可操作的通用类?

我还应该注意到,也许在某些时候,我可以将 T/C/S 重构为所有使用常见子类型的内容,以便这些转换辅助方法可以消失。不过……我还没有完全做到这一点。

最佳答案

我不明白“AbstractSearch 的典型公共(public)方法”有什么问题。抽象类定义了抽象方法,因此他们可以使用它们。

为了解决您的问题,我认为朝着正确方向迈出的一大步是定义 T、C、S 的边界,以便它们可以在抽象级别上相互使用。

例如:

abstract class Criteria {
abstract String getName();
String getNameFromSavedCriteria(SavedCriteria s) {
return s.getName();
}
}
interface SavedCriteria {
String getName();
}
public abstract class AbstractSearch<T, C extends Criteria, S extends SavedCriteria> implements Serializable {

void foo() {
System.out.println("Hello. Searching for " + getCriteria().getName());
}
}

T、C、S 不一定需要公共(public)类,C & S 可能需要。

关于java - 我怎样才能将这个可怕的具有多个泛型的抽象java类重构为 "better"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33639175/

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