java - 从基于枚举的单例类中分离业务逻辑

时间:2014-07-16 05:46:16

标签: java java-ee enums

我使用枚举方法实现了 java单例类。该类的代码如下。

我的问题是:我如何将业务逻辑与此单例类分开,或者将除了单例类创建之外的其他函数分开?

现在我已经将整个类声明为枚举,我应该将它声明为一个类,然后在其中创建一个枚举属性还是采取另一种方法?

这是我的单身人士代码。

enum TransactionHelper implements ISerialize
{
  Instance;

  private int serializePreFixCount = 1;

  /**
   * This method serializes transaction on Disk.
   */
  @Override
  public void serializeOnDisk()
  {
    //some code here

  }

  /**
   * This method serializes transaction on network stream.
   */
  @Override
  public void serializeOnNetwork()
  {
    //some code here
  }

}

当我需要使用这个类时,我会像这样使用它。

TransactionHelper.Instance.serializeOnNetwork();
TransactionHelper.Instance.serializeOnDisk();

感谢。

1 个答案:

答案 0 :(得分:1)

要分离业务逻辑,您应该使用object composition

enum TransactionHelper implements ISerialize {

    Instance(new SerializeImpl());

    private int serializePreFixCount = 1;
    private final ISerialize delegate;

    /**
     * Constructor
     */
    TransactionHelper(ISerialize delegate) {
        this.delegate = delegate;
    }

    /**
     * This method serializes transaction on Disk.
     */
    @Override
    public void serializeOnDisk() {
        delegate.serializeOnDisk();
    }

    /**
     * This method serializes transaction on network stream.
     */
    @Override
    public void serializeOnNetwork() {
        delegate.serializeOnNetwork();
    }

}

现在您可以将所有序列化逻辑放在SerializeImpl类中。


另外,如果你不介意改变

中的用法,你可以使用一个类来代替枚举
TransactionHelper.Instance.serializeOnNetwork();
TransactionHelper.Instance.serializeOnDisk();

TransactionHelper.getInstance().serializeOnNetwork();
TransactionHelper.getInstance().serializeOnDisk();

所以,只需将构造函数设为私有,就可以获得单例

class TransactionHelper {

    private TransactionHelper() { }

    private static TransactionHelper getInstance() {
        TransactionHelperHolder.INSTANCE;
    }

    private static class TransactionHelperHolder {
        private static final TransactionHelper INSTANCE = new TransactionHelper();
    }
}

希望这有帮助。