Java 为对象设置参数并避免重复代码的最佳实践是什么?

Java 为对象设置参数并避免重复代码的最佳实践是什么?,java,design-patterns,Java,Design Patterns,我在一个有一些实体的项目中工作,为了设置实体属性,我们有很多这样的代码: public void recordLogFile(int fileSize, int fileHeight, Long idFile) { try { LogFileEntity logEntity = new LogFileEntity(); logEntity.setFileSize(fileSize); logEntity.setFileHeigh

我在一个有一些实体的项目中工作,为了设置实体属性,我们有很多这样的代码:

    public void recordLogFile(int fileSize, int fileHeight, Long idFile) {

    try {

        LogFileEntity logEntity = new LogFileEntity();
        logEntity.setFileSize(fileSize);
        logEntity.setFileHeight(fileHeight);
        logEntity.setFile(FileEntity.find(idFile));
        logEntity.setStatus(LogStatus.SUCESS);
        logEntity.setType(LogType.NORMAL);
        logEntity.persist();

    } catch (Exception e) {
        some log code
    }

}
public LogFileEntity()
{
    logStatus = LogStatus.SUCESS;
    logType = LogType.NORMAL;
    // Maybe set other default values
}
有很多类需要持久化日志文件实体,但在某些情况下,我们在属性上有不同的值。例如LogStatus.FAIL LogType.OLD,我们有一段重复的代码,只改变了值

让这更好的最佳方法是什么


谢谢

如果我正确理解你的问题,我想你可以做几件事。最简单的事情是创建使用默认值构建的对象,并提供构造函数来填充其余的内容。例如,您有一个类
LogFileEntity
,它似乎有5个属性:
fileSize
fileHeight
file
logStatus
logType
。让我们假设
LogStatus.success
LogType.NORMAL
是默认值。如果在
LogFileEntity
中设置这些值,则客户端不必一直设置它们。您的类构造函数可以如下所示:

    public void recordLogFile(int fileSize, int fileHeight, Long idFile) {

    try {

        LogFileEntity logEntity = new LogFileEntity();
        logEntity.setFileSize(fileSize);
        logEntity.setFileHeight(fileHeight);
        logEntity.setFile(FileEntity.find(idFile));
        logEntity.setStatus(LogStatus.SUCESS);
        logEntity.setType(LogType.NORMAL);
        logEntity.persist();

    } catch (Exception e) {
        some log code
    }

}
public LogFileEntity()
{
    logStatus = LogStatus.SUCESS;
    logType = LogType.NORMAL;
    // Maybe set other default values
}

也就是说,IMHO,您所能做的最好的事情就是利用来实现这一点。

解决当前问题的最简单方法是添加一个重载方法,该方法采用附加参数:

    public void recordLogFile(int fileSize, int fileHeight, Long idFile) {
        recordLogFile(fileSize, fileHeight, idFile, LogStatus.SUCESS, LogType.NORMAL);
    }

    public void recordLogFile(int fileSize, int fileHeight, Long idFile,
        LogStatus status, LogType type) {

        try {

            LogFileEntity logEntity = new LogFileEntity();
            logEntity.setFileSize(fileSize);
            logEntity.setFileHeight(fileHeight);
            logEntity.setFile(FileEntity.find(idFile));
            logEntity.setStatus(status);
            logEntity.setType(type);
            logEntity.persist();

        } catch (Exception e) {
            // some log code
        }

    }

我建议采用工厂方法模式。您可以传入状态和类型的参数,并让该方法为您返回LogFileEntity对象。@Joe我认为工厂模式非常有用。。谢谢。提取到方法2。使用
recordLogFile()
的defaultsConsider内聚编写生成器。它的类名是什么?这种方法似乎不符合单一责任原则,这可能是您复制代码的真正原因。这将是有用的,看看变种有重复,太。嗨hfontanez。。。主要的是避免创建很多方法,比如recordErrorLogFile,而只是更改状态。。另一个用于更改状态和类型的。。等等…你可以做很多事情。有些比其他更复杂。例如,日志文件的单个实例可以在创建后更改状态,您可以(并且应该)使用状态模式确保文件的状态(生命周期)只能从特定状态更改为有效状态;取决于上下文。同样的事情也可以通过简单的“setter”方法来完成,但显然更简单的解决方案更容易出错,因为客户端可以将状态设置为无效状态。Factory模式解决了创建对象的问题。状态模式解决了更改其状态的问题。顺便说一句,下面是示例。他们很好地保持了示例的简单性。这是一个很好的例子,说明了问题分解的重要性。需要解决的问题之一是创建对象(LogFileEntity)。有几个创新模式可以用来解决这个问题。问题的另一部分涉及对象创建后的行为。还有其他几种行为设计模式可供选择。我向您提供了其中两种模式的链接。@PaulHenry先生,过度设计是一种带有状态模式的风险。看,我认为您的状态逻辑可能足够简单,不足以保证将其封装到单个类中。如果开关/案例中的状态和转换代码占用一页,那么它比状态类层次结构等的所有复杂性都要好。仅仅因为您的项目有状态,这并不意味着您需要应用状态模式。@Fuhrmanator过度设计对于您所做的任何事情都是一种风险。问题是什么风险更大。由于允许客户端错误地设置状态,软件也有太容易出错的风险。在设计解决方案时,必须权衡所有这些风险,并采用能够想到的最佳解决方案。通常,为了日程安排、预算、团队经验等,必须实施风险更高的解决方案。但这是我们不能争论的问题。只有OP和他的团队真正知道他们面对的是什么。由他们决定什么是最好的。