package jdepend.knowledge.pattern.impl1;
import java.util.ArrayList;
import java.util.Collection;
import jdepend.knowledge.pattern.PatternInfo;
import jdepend.metadata.Attribute;
import jdepend.metadata.Method;
import jdepend.model.JavaClassUnit;
public final class SingletonIdentifyer extends AbstractPatternIdentifyer {
@Override
public Collection<PatternInfo> identify(Collection<JavaClassUnit> javaClasses) {
Collection<PatternInfo> rtn = new ArrayList<PatternInfo>();
boolean isSingleton;
boolean getter;
for (JavaClassUnit javaClass : javaClasses) {
if(javaClass.getName().equals("jdepend.model.MetricsMgr")){
System.out.print("");
}
if (!javaClass.getJavaClass().isEnum()) {
isSingleton = true;
getter = false;
// 查找private构造方法和static的返回类型方法
for (Method method : javaClass.getJavaClass().getSelfMethods()) {
if (method.isConstruction()) {
if (method.isPublic()) {
isSingleton = false;
}
} else if (method.isStatic()) {
if (method.getReturnTypes().contains(javaClass.getName())) {
getter = true;
}
}
}
// 判断是否存在static的实例
if (isSingleton && getter) {
for (Attribute attribute : javaClass.getJavaClass().getAttributes()) {
if (attribute.isStatic()) {
if (attribute.getTypes().contains(javaClass.getName())) {
rtn.add(new PatternInfo(javaClass.getJavaClass(), javaClass.getName()));
break;
}
}
}
}
}
}
return rtn;
}
@Override
public String getExplain() {
StringBuilder explain = new StringBuilder();
explain.append(" <strong>单例模式</strong><br>");
explain.append(" 1、全部为私有构造方法;2、存在静态方法,返回类型为自己;3、存在静态属性,类型为自己。<br><br>");
return explain.toString();
}
}