/* * Copyright (c) 2006 Rogério Liesenfeld * This file is subject to the terms of the MIT license (see LICENSE.txt). */ package mockit.internal.expectations.mocking; import javax.annotation.*; import mockit.internal.reflection.*; public abstract class InstanceFactory { @Nonnull final Class<?> concreteClass; @Nullable Object lastInstance; InstanceFactory(@Nonnull Class<?> concreteClass) { this.concreteClass = concreteClass; } @Nonnull public abstract Object create(); @Nullable public final Object getLastInstance() { return lastInstance; } public abstract void clearLastInstance(); static final class InterfaceInstanceFactory extends InstanceFactory { @Nullable private Object emptyProxy; InterfaceInstanceFactory(@Nonnull Object emptyProxy) { super(emptyProxy.getClass()); this.emptyProxy = emptyProxy; } @Nonnull @Override public Object create() { if (emptyProxy == null) { emptyProxy = ConstructorReflection.newUninitializedInstance(concreteClass); } lastInstance = emptyProxy; return emptyProxy; } @Override public void clearLastInstance() { emptyProxy = null; lastInstance = null; } } static final class ClassInstanceFactory extends InstanceFactory { ClassInstanceFactory(@Nonnull Class<?> concreteClass) { super(concreteClass); } @Override @Nonnull public Object create() { lastInstance = ConstructorReflection.newUninitializedInstance(concreteClass); return lastInstance; } @Override public void clearLastInstance() { lastInstance = null; } } }