package jdepend.model; public abstract class AbstractSubJDependUnit extends AbstractJDependUnit implements SubJDependUnit { private transient GroupCohesionInfo groupCohesionInfo = null; private transient GroupCouplingInfo groupCouplingInfo = null; private transient GroupInfoCalculator groupInfoCalculator; public AbstractSubJDependUnit() { super(); } public AbstractSubJDependUnit(String name) { super(name); } public AbstractSubJDependUnit(AbstractSubJDependUnit unit) { super(unit); this.groupCohesionInfo = unit.groupCohesionInfo; this.groupCouplingInfo = unit.groupCouplingInfo; this.groupInfoCalculator = unit.groupInfoCalculator; } public synchronized GroupCouplingInfo getGroupCouplingInfo() { if (this.groupCouplingInfo == null) { this.groupCouplingInfo = this.getGroupInfoCalculator().getGroupCouplingInfo(); } return this.groupCouplingInfo; } @Override public synchronized GroupCohesionInfo getGroupCohesionInfo() { if (this.groupCohesionInfo == null) { this.groupCohesionInfo = this.getGroupInfoCalculator().getGroupCohesionInfo(); } return this.groupCohesionInfo; } protected synchronized GroupInfoCalculator getGroupInfoCalculator() { if (this.groupInfoCalculator == null) { this.groupInfoCalculator = createGroupInfoCalculator(); } return this.groupInfoCalculator; } protected abstract GroupInfoCalculator createGroupInfoCalculator(); @Override public void clear() { super.clear(); this.groupCohesionInfo = null; this.groupCouplingInfo = null; this.groupInfoCalculator = null; } }