如何将代码外部化为抽象类

时间:2018-06-18 10:00:37

标签: java generics abstract

我有以下代码:

public class A {
  private int id;
  private String name = null;
  private static int counter = 0;
  private static Stack<A> pool = new Stack<>();

  private A (){
    A.counter += 1;
    setId();
  }

  private void setId(){
    id = A.counter;
  }

  public void setName(String name) {
    this.name = name;
  }

  public static A getInstance() {
   A element;
   try {
        element = pool.pop();
      } catch (EmptyStackException e) {
        element = new A();
      }
    return element;
  }

  public static void returnInstance(A element) {
    pool.push(element);
  }
}

如何将getInstance(),returnInstance()和私有静态Stack池外部化为抽象类?

1 个答案:

答案 0 :(得分:1)

正如评论中所说,你不能。但是你可以创建一个随后委派的Helper类:

public final class Pool<T> {
     private final Stack<T> pool = new Stack<>();
     private final Supplier<? extends T> provider;

     public Pool(Supplier<? extends T> provider){
         this.provider = provider;
     }

     public T getInstance() {
         T element;
         try {
             element = pool.pop();
         } catch (EmptyStackException e) {
             element = provider.get();
         }
         return element;
     }

     public void returnInstance(T element) {
         pool.push(element);
     }
}

在课堂上A

public class A{
    private int id;
    private String name = null;
    private static int counter = 0;

    public static final Pool<A> pool = new Pool<>(A::new);

    private A (){
        A.counter += 1;
        setId();
    }

    private void setId(){
        id = A.counter;
    }

    public void setName(String name) {
        this.name = name;
    }
}

然后可以按如下方式使用:

A a = A.pool.getInstance();
// do some stuff with a
A.pool.returnInstance(a);

此类Pool现在可以在任何想要拥有相同机制的地方使用。