如果一个类包含一个对象作为实例变量,并且其中一个构造函数包含一个与参数类型相同的对象,那么最佳做法是将参数指定给实例变量,还是从参数创建一个新对象,然后将新对象指定给实例变量。
下面是我正在做的一个练习的一个例子:
public class MyCircle {
private MyPoint center; //contains variables int x and int y
private int radius;
//Non-controversial Constructor:
public MyCircle(int x, int y, int radius ) {
//creates new center using a valid MyPoint constructor
this.center = new MyPoint(x, y);
this.radius = radius;
}
//OPTION A
public MyCircle( MyPoint center, int radius ) {
this.center = center;
this.radius = radius;
}
//OPTION B
public MyCircle( MyPoint center, int radius ){
this.center = new MyPoint( center.getX(), center.getY() );
this.radius = radius;
}
}
起初,我输入了选项A,但我认为如果这样做,可能会产生错误行为。中心
引用了可能被无意中间接修改的现有对象。我想,另一种思考方式是,这为创建共享一个中心的多个对象创建了一条途径,移动一个中心会有意移动共享该中心的所有圆。
这两个选项都可以,但是正如你所说的,一个对象可能会随着时间的推移而改变,当你想同时修改多个对象中的中心时,选项A是可以的,例如在圆圈列表中,但是如果你想拥有唯一和独立的中心点,选项B是正确的。所以你为什么不同时拥有两个构造函数,并根据应用程序中的许多情况使用一个或另一个,使用任何你认为更好的东西,保留两个,这是我的建议。
希望对你有帮助。
我认为这取决于你的程序,如果你希望圆圈有一个对MyPoint
对象的引用,那么你必须传递它,否则,为什么不传递实际上x
和y
值本身。
例如,选项B可以写成:
public MyCircle(int x, int y, int radius) {
// rest
}
因为Java没有指针(至少对开发人员来说不是),所以这个选项将被放弃,而且不是一个好办法。。现在:
public MyCircle( MyPoint center, int radius ) {
this.center = center;
this.radius = radius; }
在我看来更好,你可以只分配中心,不需要制作MyPoint类的风险副本...我说有风险是因为如果你想这样做,你至少应该检查该参数的非空条件......
如果选项A中的center为null,你是对的,这是可能发生的,那么你可以通过抛出非法参数来处理它,或者只是将该对象分配给默认值。...
但正如我之前所说,这是我的观点。。
我学到了两件事: -操作符创建一个新实例,然后执行声明的connstuctor来初始化该新实例 根据我的理解,这些说法互相反对。 例如,不会创建两个实例,因为-操作符创建一个实例,构造函数调用并创建另一个实例?当然不会,但现在到底是什么创建了一个实例。。。?
在Scala中,我想创建一个抽象类,它接受一些“策略”参数(这里是)和一个值参数(这里为)。我想从该类继承,将策略参数作为继承的一部分提供,并获得一个类(这里是),该类接受该值作为构造函数参数。 下面是我希望能够运行的代码: 不幸的是,我收到以下错误: 错误:构造函数Cls1的参数太多:()A$A58.this.Cls1惰性val obl=new Cls1(5)错误:缺少构造函数Base的参数列表
我在创建对象和参数化构造函数时遇到以下错误。 Main.java: 6:错误:构造函数Cipher类中的Cipher不能应用于给定类型 必需:无参数 找到:int 原因:实际参数列表和正式参数列表的长度不同 这是我的文件的样子
我有以下课程布局: 我正在为服务创建一个单元测试,但我想将ServiceHelper用作一个“活动”类,但要模拟ServiceHelper中的构造函数参数。有没有办法通过Mockito实现这一点?
问题内容: 我正在尝试修复我的一个程序中的错误,我认为这可能是由于Hibernate弄清楚了如何在不调用其默认(或任何其他)构造函数的情况下实例化对象的实例。 问题答案: 实际上,是的,如果使用objenesis为您实例化对象,则可以在实例化对象时绕过构造函数。它执行字节码操作来实现此目的。 反序列化对象也将绕过构造函数。 使用反射无法做到这一点。
我在弄清楚如何根据给定的类型在构造函数中创建一个新对象时遇到了困难。 例如,我有一个机器人驱动程序,它有一个默认构造函数,不接受任何参数,并创建一个基本的机器人。但我有另一个构造器,根据这个论点创造了一个新的机器人。 是一个接口。那么,如果我想创建,使其是另一种类型,比如?我需要做一些类型的铸造吗?