我有一个家庭作业,要求我在我创建的对象中实现一个方法,该方法返回一个该类型的对象,而该方法没有参数。我能想到的唯一方法是在方法中创建一个该类的对象。我的问题是,这是正确的模式设计吗?我的意思是,它工作正常,但我不知道它是否是好的实现。方法是这样的:
public Matrix flipHorizontal(){ }
所以我在这个方法中创建了一个矩阵对象(带有复制构造函数),它是Matrix类的一部分,然后我相应地操作了这个矩阵,然后我返回了这个对象。
ycl3bljg1#
当然,让某个类X的成员函数返回新创建的X示例是一种合理的做法。特别是当X被设计成不可变的时候,例如BigDecimal。该类允许对象的数学计算--但是每个示例在创建时都不能改变。因此,没有其他方法可以通过返回一个新的BigDecimal来实现plus(BigDecimal other),该BigDecimal表示“this + other”。唯一不*工作的是:在X的构造函数中创建X的另一个示例。2这很容易导致一个永不结束的递归。3它在某个时候以堆栈溢出结束,或者可能是内存不足的问题。
plus(BigDecimal other)
mspsb9vt2#
是的,非常好。它通常用于对象不可变的情况。这样的方法可以返回对象的副本并应用一些修改。以LocalDate.withYear为例,它是一个示例方法,返回一个新的不可变的LocalDate。
LocalDate.withYear
LocalDate
LocalDate date = LocalDate.of(2018, 1, 1); LocalDate nextYear = date.withYear(2019);
我们现在有两个不同的例子,一个在另一个之后一年。如果你想这样做,你的对象不需要是不可变的,尽管这可能是它最常用的地方。如果你的类不是不可变的,你可能应该在JavaDoc中注意到方法返回一个新的示例,而不是修改现有的示例,以防止任何混淆。或者,匹配该签名的另一个实现是修改当前示例,然后修改return this:
return this
class Matrix { Matrix flipHorizontal() { //do the flip... return this; } }
这实际上是一种fluent interface,它可能是可取的,但在您的情况下,我认为它可能不是。
2条答案
按热度按时间ycl3bljg1#
当然,让某个类X的成员函数返回新创建的X示例是一种合理的做法。
特别是当X被设计成不可变的时候,例如BigDecimal。该类允许对象的数学计算--但是每个示例在创建时都不能改变。因此,没有其他方法可以通过返回一个新的BigDecimal来实现
plus(BigDecimal other)
,该BigDecimal表示“this + other”。唯一不*工作的是:在X的构造函数中创建X的另一个示例。2这很容易导致一个永不结束的递归。3它在某个时候以堆栈溢出结束,或者可能是内存不足的问题。
mspsb9vt2#
是的,非常好。它通常用于对象不可变的情况。这样的方法可以返回对象的副本并应用一些修改。
以
LocalDate.withYear
为例,它是一个示例方法,返回一个新的不可变的LocalDate
。我们现在有两个不同的例子,一个在另一个之后一年。
如果你想这样做,你的对象不需要是不可变的,尽管这可能是它最常用的地方。如果你的类不是不可变的,你可能应该在JavaDoc中注意到方法返回一个新的示例,而不是修改现有的示例,以防止任何混淆。
或者,匹配该签名的另一个实现是修改当前示例,然后修改
return this
:这实际上是一种fluent interface,它可能是可取的,但在您的情况下,我认为它可能不是。