我有一个作业,需要添加2个构造函数,并与之分开,还列出了变异子。但是我认为大多数构造函数都是变种器:如本post所示。所以我很困惑我需要对mutator方法做什么?我现在有下面的构造函数:
//Constructors
public Species() {
speciesName = "Balaenoptera musculus";
population = 15000;
growthRATE = -0.12;
if (endangered(growthRATE) == true) {
status = "endangered";
} else {
status = "not endangered";
}
}
public Species(String name, int populationSize, double GR) {
speciesName = name;
population = populationSize;
growthRATE = GR;
if (endangered(GR) == true) {
status = "endangered";
} else {
status = "not endangered";
}
}
public Species(Species species) {
speciesName = species.getSpeciesName();
population = species.getPopulation();
growthRATE = species.getGrowthRate();
if (endangered(growthRATE) == true) {
status = "endangered";
} else {
status = "not endangered";
}
}
基于评论:
这是我尝试过的方法,但是会导致以下错误
PrintStream类型的方法print(boolean)不适用于参数 (无效)
在主行的这一行:
Species O5 = O1;
System.out.print(O5.changeSpeciesName("Gorilla beringei"));
方法如下:
public void changeSpeciesName(String newSpeciesName) {
speciesName = newSpeciesName;
}
答案 0 :(得分:4)
构造函数的全部要点是初始化实例,这需要设置字段-因此,您会认为构造函数是变种器,对吗?这有点技术性,但是更改器专门更改现有实例上的字段 的值,而构造函数创建该实例。很多时候,构造函数会“变异”正在创建的实例-但这是构造函数,而不是变异器。
另一方面,Mutators是专门更改实例属性的方法。例如:
public void setName(String name) {
this.name = name;
}
我不知道您在这里的确切分配是什么,但是我有种感觉,有人告诉您编写mutator方法,然后在构造函数中调用它们。例如,代替
speciesName = "Balaenoptera musculus";
speciesName = name;
speciesName = species.getSpeciesName();
你应该做
setName("Balaenoptera musculus");
setName(name);
setName(species.getSpeciesName());
基本上,与其让构造函数自己更改变量,不如调用类的mutator来更改变量。
人们通常会告诉您这样做的一般原因是出于诸如“如果我们改变名称的设置方式会怎样?”之类的问题。这样,如果发生某些更改,我们只需要在一个地方更改它:mutator函数setName()
。否则,我们将不得不更改每个构造函数,而这是另外两个更改-我们可能会忘记其中的一个,这会产生一个错误。
但是,在构造函数中使用方法调用时,请确保派生类不能覆盖您调用的方法。因为代码可能使用部分初始化的对象,所以这可能导致不良行为。由于代码看起来还不错,但是却没有达到您的预期目的,因此很难找到导致的错误。
您可以通过在方法声明中使用final来避免此类问题
public final void setName(String name) {
this.name = name;
}
或避免在构造函数中调用方法。