构造函数是变量吗?

时间:2018-11-19 03:04:04

标签: java

我有一个作业,需要添加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;
}

1 个答案:

答案 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;
}

或避免在构造函数中调用方法。