- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们的 JSF Web 应用程序中有多个具有类似功能的搜索页面:
所以这些都使用 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/
我们在 session 中存储两个对象。不知何故,来自另一个用户的对象之一被加载到另一个用户的 session 中。用户应该无权访问此特定数据,一旦他们看到它,他们就知道出了什么问题。 我们有向他提供
我现在正在使用 Firefox 5 检查我的网站,我发现字体的呈现很糟糕。 这就是 Firefox (5) 和 Chrome 之间的区别:例如,看看文本 Jeffe 是如何呈现的... 默认字体系列是
我是一名优秀的程序员,十分优秀!