看Acegi源码时,发现这么一段有些奇怪的代码.
protected Filter[] obtainAllDefinedFilters() {
Iterator cads = this.filterInvocationDefinitionSource.getConfigAttributeDefinitions();
Set list = new LinkedHashSet();
while (cads.hasNext()) {
ConfigAttributeDefinition attribDef = (ConfigAttributeDefinition) cads.next();
Filter[] filters = obtainAllDefinedFilters(attribDef);
for (int i = 0; i < filters.length; i++) {
list.add(filters[i]);
}
}
return (Filter[]) list.toArray(new Filter[0]);
}
红色的代码为什么不直写成: return obtainAllDefinedFilters(attribDef);呢? 毕竟 obtainAllDefinedFilters本身就是返回一个Filter数组,为什么那个方法里还有再重复的加到一个List中,再把list转为数组呢?
是Acegi开发小组粗心的过?还是有意为之?
下面是红色代码调用的那个方法:
private Filter[] obtainAllDefinedFilters(ConfigAttributeDefinition configAttributeDefinition) {
List list = new Vector();
Iterator attributes = configAttributeDefinition.getConfigAttributes();
while (attributes.hasNext()) {
ConfigAttribute attr = (ConfigAttribute) attributes.next();
String filterName = attr.getAttribute();
if (filterName == null) {
throw new IllegalArgumentException("Configuration attribute: '" + attr
+ "' returned null to the getAttribute() method, which is invalid when used with FilterChainProxy");
}
if (!filterName.equals(TOKEN_NONE)) {
list.add(this.applicationContext.getBean(filterName, Filter.class));
}
}
return (Filter[]) list.toArray(new Filter[list.size()]);
}