package jdepend.knowledge.pattern.impl2.feature; import jdepend.knowledge.pattern.impl2.AbstractFeature; import jdepend.knowledge.pattern.impl2.FeatureCheckContext; import jdepend.metadata.Attribute; import jdepend.metadata.InvokeItem; import jdepend.metadata.JavaClass; import jdepend.metadata.Method; import jdepend.model.JavaClassUnit; public class BuilderFeature extends AbstractFeature { @Override protected boolean have(FeatureCheckContext context) { if (context.getHaveSubClassesAbstractAttributes() != null) { for (Attribute attribute : context.getHaveSubClassesAbstractAttributes()) { for (JavaClass builder : attribute.getTypeClasses()) { for (Method method : context.getCurrent().getSelfMethods()) { // 识别builderMethod if (method.getReturnTypes().size() == 1 && method.getReturnClassTypes().size() == 1) { JavaClass productType = method.getReturnClassTypes().iterator().next(); for (InvokeItem invokeItem : method.getInvokeItems()) { Method invokeMethod = invokeItem.getCallee(); if (invokeMethod.getJavaClass().equals(builder) && invokeMethod.getReturnTypes().size() == 1 && invokeMethod.getReturnClassTypes().size() == 1) { if (invokeMethod.getReturnClassTypes().iterator().next().equals(productType)) { this.setPatternInfo(attribute.getName() + "." + invokeItem.getCallee().getName()); return true; } } } } } } } } return false; } @Override public String getName() { return "类方法中调用了Builder的方法 两个方法返回相同的数据类型"; } }