避免使用泛型方法重复Java中的代码

时间:2019-03-22 08:16:52

标签: java android

在我的Android应用程序中,我执行了一些与房间数据库相关的操作。这些操作必须在后台完成,这就是为什么我使用threadExecutor的原因。如您所见,这两种方法的代码几乎相同,我想知道是否有可能构造一些通用的东西来避免代码重复。

public void addOperation(Operation operation, AddOperationInteractor.CallBack callback)
{
    Interactor interactor = new AbstractInteractor(ThreadExecutor.getInstance())
    {
        @Override
        public void run()
        {
            try
            {
                operationRepository.addNewOperation(operation);
                callback.onAddOperationSuccess();
            }
            catch (Exception ex)
            {
                callback.onAddOperationSuccess();
            }
        }
    };

    interactor.execute();
}

public void deleteOperation(Operation operation, RemoveOperationInteractor.CallBack callback)
{
    Interactor interactor = new AbstractInteractor(ThreadExecutor.getInstance())
    {
        @Override
        public void run()
        {
            try
            {
                operationRepository.removeOperation(operation);
                callback.onRemoveOperationSuccess();
            }
            catch (Exception ex)
            {
                callback.onRemoveOperationSuccess();
            }
        }
    };

    interactor.execute();

1 个答案:

答案 0 :(得分:0)

我发现您的代码中没有重复。要减少样板代码,请尝试使用lambda:

public void addOperation(Operation operation, AddOperationInteractor.CallBack callback) {
    ThreadExecutor.getInstance().execute(() -> {
        try {
            operationRepository.addNewOperation(operation);
        }
        finally {
            callback.onAddOperationSuccess();
        }
    });
}

public void deleteOperation(Operation operation, RemoveOperationInteractor.CallBack callback) {
    ThreadExecutor.getInstance().execute(() -> {
        try {
            operationRepository.removeOperation(operation);
        }
        finally {
            callback.onRemoveOperationSuccess();
        }
    });
}

现在只有1条重复行来调用ThreadExecutor。

或者将回调传递给辅助方法:

public void addOperation(Operation operation, AddOperationInteractor.CallBack callback) {
    execute(()-> operationRepository.addNewOperation(operation),
            ()-> callback.onAddOperationSuccess());
}

public void deleteOperation(Operation operation, RemoveOperationInteractor.CallBack callback) {
    execute(()-> operationRepository.removeOperation(operation),
            ()-> callback.onRemoveOperationSuccess());
}

private void execute(Runnable action, Runnable onSuccess) {
    ThreadExecutor.getInstance().execute(() -> {
        try {
            action.run();
            onSuccess.run();
        } catch (Exception e) {
            LOG.warn(e);
            onSuccess.run();
        }
    }
}