gpt4 book ai didi

java - 关于继承和接口(interface)的设计困惑

转载 作者:行者123 更新时间:2023-11-30 02:43:15 25 4
gpt4 key购买 nike

我遇到了一个相当奇怪的设计问题。我正在使用 Java ORM,并定义了我的模型类之一,如下所示:

class User extends Model {
// . . .
}

现在,有更多模型,我希望它们都支持数据验证。这个想法很简单:当调用每个 setter 方法时,错误的内部 ArrayList 不断被填充。

现在,所有模型类的错误处理机制都完全相同。我可以想象以下界面:

public interface ErrorReportable {
ArrayList<String> errors = new ArrayList<String>();

boolean hasErrors();

ArrayList<String> getErrors();

void resetErrors();
}

现在我遇到了一个问题:所有方法都是抽象的,这意味着我必须在我的类中为所有这些方法提供实现。这是可悲的,因为所有这些方法都将以完全相同的方式实现。理想情况下,这将是我完全继承的另一个类,但遗憾的是,Java 中没有多重继承。

我的下一个选择是在接口(interface)中使用默认方法,但这里的问题是 errors 字段,该字段将变为静态,而我需要为每个实例使用一个常规字段。

看起来唯一的解决方案是组合,但是我必须在 User 上有一个 hasErrors() 方法,它将返回这个.error_obj.hasErrors()。这很好,但在我看来并不是很简洁,因为我必须写两次。

我怎样才能做得更好?

最佳答案

我认为模型类最好只公开 List<Error> validate()方法,并拥有一个独立的 validator 来验证所有字段并收集错误。

这样,收集到的消息就不是模型状态的一部分,您可以明确控制验证何时发生,您更喜欢组合(这几乎总是一件好事),也是您需要的唯一方法在模型类中实现的是特定于实体的验证。

如果您需要添加任何跨字段验证,则扩展此设计以与字段验证一起执行这些验证也可能非常容易。

关于java - 关于继承和接口(interface)的设计困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41020045/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com