Java 类是否应该负责检查是否创建了可行的对象?如果是,怎么做?

Java 类是否应该负责检查是否创建了可行的对象?如果是,怎么做?,java,class,constructor,Java,Class,Constructor,我刚刚开始学习面向对象的w/Java,遇到了一个问题,这让我开始思考,尽管可能太多了。我寻找答案已经有一段时间了,但找到正确的问题往往是最大的挑战 我用两个方法isTriangle()和typeOfTriangle()创建了一个类三角形。我的构造函数有3个参数(side1、side2、side3) 这是我的第一次体验,我意识到用户可以传入参数来创建一个实际上不是三角形的对象,就像两条边加在一起小于第三条边的情况一样。我向构造函数添加了逻辑,以检查实际参数是否构成三角形。这似乎根本不是正确的做法

我刚刚开始学习面向对象的w/Java,遇到了一个问题,这让我开始思考,尽管可能太多了。我寻找答案已经有一段时间了,但找到正确的问题往往是最大的挑战

我用两个方法isTriangle()和typeOfTriangle()创建了一个类三角形。我的构造函数有3个参数(side1、side2、side3)

这是我的第一次体验,我意识到用户可以传入参数来创建一个实际上不是三角形的对象,就像两条边加在一起小于第三条边的情况一样。我向构造函数添加了逻辑,以检查实际参数是否构成三角形。这似乎根本不是正确的做法

问题: Triangle类是否应该负责确定实际参数是否创建可行的三角形?如果是,怎么做?这种逻辑真的会与构造函数相一致吗

是否需要先创建对象(非三角形),然后确定所创建的对象是否适用于myTriangle.isTriangle()

似乎客户机/用户不应该负责确定Triangle类是否返回可行的三角形。这不是应该假设的吗?虽然我一直听说假设是所有错误的根源

我没有把代码作为它的基础,我相信你们都明白了。只是不确定这项检查应该在哪里进行。似乎如果类不是三角形,它就不应该返回任何内容。我很可能是想得太多了


感谢您抽出时间阅读我的帖子。

允许或禁止“无效”三角形是否更有意义取决于您;例如,如果你在做计算,禁止它们可能是有意义的

如果您有这些类型的先决条件,您应该在构造函数中检查它们并抛出异常(
IllegalArgumentException
或它的自定义子类通常是正确的选择)


另一方面,如果允许一个“无效”三角形是有意义的,那么您当然可以检查
isValid()
方法。

如果我尝试这样做,我会首先验证用户输入,以确保给定的长度可以形成三角形(请参阅)。确认值有效后,使用参数调用三角形构造函数


通过这种方式,您可以知道三角形对象始终是有效的三角形,因为您已经验证了用户输入。

检查构造函数内部不是最好的方法,因为即使您注意到它不是三角形,也会创建该对象。在使用构造函数之后检查也有同样的问题,所以我会在使用构造函数之前检查。此构造函数非常简单,因此任何这种方法都不会对项目产生任何影响。但是,如果您经常这样做,并且使用要求更高的构造函数,则不创建对象和节省效率时间可能是有利的


编辑:一位用户刚刚对这个答案发表评论说,构造函数中抛出的异常可以阻止对象实例化,这使得在构造函数中进行检查成为一个可行的选项。

可能重复@svasa感谢您的参考。对chrylis提到的内容进行了更深入的探讨。很难再次提出这个问题,谢谢你的链接;如果不满足先决条件,则抛出异常。这是真的,但即使抛出异常,实例仍会被创建,因此我的观点是正确的。不,不是。构造函数的异常退出阻止了对象的创建。出于某种原因,我认为对象仍然是实例化的,但我承认我可能错了。谢谢你指出outIllegalArgumentException是我的想法,虽然我不知道它是什么,所以谢谢你的帖子。我更愿意将这个逻辑保存在类中,以便类本身处理它。是的,根据情况/场景/规格,可能有多种方法来处理此问题,再次感谢您提及。感谢您发布链接。我需要更改isTriangle()方法,以反映side1+side2