Java 无存取器方法和mutator方法

Java 无存取器方法和mutator方法,java,Java,我的讲师告诉我,我班上没有访问器和变异器方法,但我不知道他的意思,因为我确实包括了访问器和变异器方法 我能想到的两个问题是: 1.我的变量必须是针对每个单独的变量,而不是同时针对所有的变量 2.我的子类需要我的超类变量的访问器和mutator方法 我确实问过我的讲座,但他说你自己去弄清楚,我没有把toString包括在内 abstract class TwoD implements Shape { //protected instance variables as the

我的讲师告诉我,我班上没有访问器和变异器方法,但我不知道他的意思,因为我确实包括了访问器和变异器方法

我能想到的两个问题是:

1.我的变量必须是针对每个单独的变量,而不是同时针对所有的变量

2.我的子类需要我的超类变量的访问器和mutator方法

我确实问过我的讲座,但他说你自己去弄清楚,我没有把toString包括在内

        abstract class TwoD implements Shape
{
    //protected instance variables as the subclasses will use them
    protected int a;
    protected int b;
    protected int c;

    //default constructor
    public TwoD() {}

    //constructor for circle
    public TwoD(int a)
    {
        this.a = a;
    }

    //constructor for rectangle
    public TwoD(int a, int b)
    {
        this.a = a;
        this.b = b;
    }

    //constructor for triangle
    public TwoD(int a, int b, int c)
    {
        this.a = a;
        this.b = b; 
        this.c = c;
    }

    //copy constructor
    public TwoD(TwoD td)
    {
        this (td.a, td.b, td.c);
    }

    //accessor methods to get variables
    public int getA()
    {
        return a;
    }

    public int getB()
    {
        return b;
    }

    public int getC()
    {
        return c;
    }

    //mutator methods to set variables
    public void setA(int a)
    {
        this.a = a;
    }

    public void setAB(int a, int b)
    {
        this.a = a;
        this.b = b;
    }

    public void setABC(int a, int b, int c)
    {
        this.a = a;
        this.b = b;
        this.c = c;
    }
class Circle extends TwoD
{
    //default constructor
    public Circle() {}

    public Circle(int radius)
    {
        super(radius);
    }

    //method to calculate area of circle
    @Override
    public double area()
    {
        return Math.PI * a * a;
    }

    //method to get calculated area
    @Override
    public double getArea()
    {
        return area();
    }

访问器方法通常称为getter,而mutator方法通常称为setter

Java世界中广泛使用的一种模式是

  • 将字段(实例变量)设置为私有

  • 如果需要访问器方法,请添加一个getter

    public int getA() {
        return this.a;
    }
    
  • 如果需要mutator方法,请添加setter

    public void setA(int a) {
        this.a = a;
    }
    
存取器和变异器方法几乎总是改变单个字段

请注意,我也不喜欢这种设计。由于子类只能添加功能,并且无法删除或隐藏功能,因此必须明智地选择哪个类扩展另一个类。一个例子就是众所周知的



您还需要使用自描述性名称
a
b
c
应该改名为更好地描述这些变量所代表的内容。

您自己已经找到了答案。你的讲师指的是你在第1点和第2点中描述的内容。您需要做的就是去掉
setAB
setABC
并添加setter方法。(单词“accessor”和“mutator”分别是getter和setter的同义词)所以我仍然需要子类的accessor和mutator方法,即使我已经在我的超类中使用了它?据我所知,在我的TwoD超类中,我已经有了变量a、b和c的get和set方法。我没有理由在我的Circle子类中为相同的变量添加另一个get and set方法。这不是必需的,因为
Circle
扩展了
TwoD
中所有非私有非静态方法。我建议您将变量字段也设置为私有。没有必要为子类提供对它们的直接访问,因为它们可以调用getter和setter方法,如果您不这样做,那么将来更改行为将变得更加困难。@AaronDavis通常我会,但我目前正在遵循讲师提供的uml图。
public void setA(int a) {
    this.a = a;
}