我认为JSF存在命名空间污染,我必须将私有成员暴露给我不应该做的世界。
以下是一个例子:
假设我有一个包含From数据和To date输入表单的表单,它在支持bean中表示为:
private Date fromDate;
private Date toDate;
// then getters and setters only so JSF XHTML page can see the fields and work with 'em
然后我有这个私有方法,在post构造上调用:
private List<? extends StatisticsModel> _getDataModel() {
List<? extends StatisticsModel> dataModel = null;
if (isSingleDate()) {
dataModel = getDataModel(getFromDate(), getFromDate(),
getSelected());
} else {
dataModel = getDataModel(getFromDate(), getToDate(),
getSelected());
}
return dataModel;
}
调用每个子类必须实现的抽象方法:
protected abstract List<? extends StatisticsModel> getDataModel(Date from, Date to, String[] selected);
如果仔细观察,您会发现抽象方法from date
和to date
参数过于关键且与私有字段不同。
但是由于JSF,我必须使日期的私有字段公开,因此开发人员 - 谁将在子类上工作 - 将在作为args发送给方法的日期和作为继承的日期之间混淆来自超级班的公共财产。
对于这种情况,我做了一个解决方法,在前面添加一个得分低的私人字段名称(C技巧),但我认为这还不够好。
修改
问题是,在理想世界中,fromDate和toDate字段应保持对超类的私有,而他只知道那时,然后他会转换然后将它们传递给子类(如_getDataModel
方法中所做的那样) 。但是在JSF中,这个日期字段应该有Getters和Setters(可以从XHTML
页面访问),因此也可以访问此Controller的子类,这会导致在处理子类时出现混乱,因为子类将能够看到2 from date
个变量(1个字段+ 1个arg)和2个to date
变量。 (每对可能有不同的值)。我希望我现在很清楚!
你认为这是一个真正的问题吗?我们如何解决它?