Java 访问超类中的受保护变量

Java 访问超类中的受保护变量,java,oop,inheritance,Java,Oop,Inheritance,我最近加入了一家新公司,我正在努力适应他们的编码风格准则。我对改变我的编码风格没有问题,但有一点我不确定它们是否正确 在我的第一个任务中,我必须扩展一个现有的抽象类来开发特定的功能。因此,我需要访问这个抽象超类中声明的许多属性。为此,我建议更改这些属性的可见性,并将它们声明为受保护。他们的回答让我感到惊讶: “永远不会!这绝对不利于OOP,而且会产生晦涩难懂且难以维护的代码!您需要做的是在超类中创建一个getter,并从子类中使用它来访问这些属性” 嗯,我一直在抽象超类中使用受保护的属性,并直接

我最近加入了一家新公司,我正在努力适应他们的编码风格准则。我对改变我的编码风格没有问题,但有一点我不确定它们是否正确

在我的第一个任务中,我必须扩展一个现有的抽象类来开发特定的功能。因此,我需要访问这个抽象超类中声明的许多属性。为此,我建议更改这些属性的可见性,并将它们声明为受保护。他们的回答让我感到惊讶:

“永远不会!这绝对不利于OOP,而且会产生晦涩难懂且难以维护的代码!您需要做的是在超类中创建一个getter,并从子类中使用它来访问这些属性”

嗯,我一直在抽象超类中使用受保护的属性,并直接从子类访问它们,我一直认为这没有什么问题。甚至我会说,一直调用getter来访问超类中的属性要比按名称使用它慢

你觉得怎么样?是在一个超类中声明属性并直接访问它们的普通/标准编码风格,还是您认为为这些属性创建getter更好

为了sumarize,我的方式:

public abstract class A {

    protected String variableA="a";

    public abstract methodToImplement();    

}

public MyClass B extends A {

    public methodToImplement() {
        System.out.println(variableA.length());
    }

}
他们的方式:

abstract class A {
    protected String variableA="a";
    public String getVariableA() {
        return variableA;
    }
    public abstract methodToImplement();
}

MyClass B extends A {
    public methodToImplement() {
        System.out.println(getVariableA().length());
    }
}

谢谢。

正如其他线程已经指出的那样,确实建议使用getter和setter。原因是,如果您计划更改该值的表示形式(例如StringBuilder而不是String),则必须更改代码。getter/setter允许您以某种方式编程,即向getter/setter发送所需的数据,并且它们会将数据存储在适当的字段中(例如,将其附加到StringBuilder)。因此,是的,它似乎有很多优势,即使这不是你的编码风格。然而,当您同时使用getter和setter时,将变量声明为protected似乎很奇怪

我个人尽量避免有点过火的能手/二传手。对我来说,它们是对值变量的过度杀伤力。然而,对于参考变量,它们是一个好主意


但是,我认为这里没有对错。

受保护变量的要点是子类可以访问它。在这种情况下,编写getter/setter并不是真正必要的。所以在我看来,我更愿意直接访问它们。只需简单地编写更少的代码,就可以知道变量的来源。如果您需要对变量进行额外的约束,getter和setter可能很有用。和this的可能重复:和this:我担心这是一个不适合堆栈溢出的问题,因为您可能会给出公正的意见,而不是“正确”或“错误”。另外,我认为“他们的方式”应该将
variableA
声明为
private
,否则使用公共getter就没有意义了,您不需要首先更改变量的可见性。正如您从其他评论中看到的,Java程序员通常更喜欢将变量设置为私有,因为我也编写Ruby代码(对于超类的变量,只有有限的隐私),我在使用受保护的变量方面没有问题。