java是一个构造函数还是一个变种人?
我有一个任务,我需要添加2个构造函数,并从中分离出来,还列出了变异子。然而,我认为大多数构造器都是变异的:从这个post中可以看出。所以我很困惑,对于变异子方法,我需要做什么?目前,我为施工人员提供以下服务:
//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";
}
}
根据评论:
以下是我尝试过的,但它会导致以下错误
The method print(boolean) in the type PrintStream is not applicable for the arguments (void)
在这条主线上:
Species O5 = O1;
System.out.print(O5.changeSpeciesName("Gorilla beringei"));
方法如下:
public void changeSpeciesName(String newSpeciesName) {
speciesName = newSpeciesName;
}
# 1 楼答案
构造函数的全部要点是初始化实例,这需要设置字段,所以你会认为构造函数是一个变种,对吗?这有点技术性,但是一个变异子专门改变一个现有实例上的字段的值,而构造函数创建该实例。很多时候,构造函数确实“变异”了它正在创建的实例——但它是一个构造函数,而不是变异器
另一方面,变异子是专门用来改变实例属性的方法。例如:
我不知道你的任务是什么,但我有一种感觉,你被告知要编写mutator方法,然后在构造函数中调用它们。例如
你应该这么做
基本上,与其让构造函数自己更改变量,不如调用类的mutator来更改变量
人们会告诉你这样做的一般原因是出于对“如果我们改变名称的设置方式会怎么样”这样的问题的担忧这样,如果有什么改变,我们只需要在一个地方改变它:突变函数
setName()
。否则,我们将不得不更改每个构造函数,这是两个额外的更改——我们可能会忘记其中一个,这将创建一个bug但是,在构造函数中使用方法调用时,请确保所调用的方法不能被派生类重写。这可能会导致不期望的行为,因为代码可能会使用部分初始化的对象。结果错误很难找到,因为代码看起来不错,但并没有达到预期的效果
通过在方法声明中使用final,可以避免此类问题
或者通过避免构造函数中的方法调用