【问题标题】:Accessing protected variables in the super class访问超类中的受保护变量
【发布时间】:2014-05-14 22:04:28
【问题描述】:

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

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

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

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

你怎么看?是在超类中声明属性并直接访问它们的正常/标准编码风格,还是您认为更好地为这些属性创建 getter。

总结一下,我的方式:

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。所以在我看来,我更喜欢直接访问它们。它只是减少了代码,并且您知道变量的来源。如果您需要对变量进行额外约束,getter 和 setter 会很有用。
  • 恐怕这是一个不太适合 Stack Overflow 的问题,因为您可能只会给出意见,而不是“正确”或“错误”。另外我认为“他们的方式”应该将variableA 声明为private,否则使用公共getter 将毫无意义,并且您不需要首先更改变量的可见性。正如您从其他 cmets 中看到的那样,Java 程序员通常更喜欢将变量设为私有,因为我也编写 Ruby 代码(超类的变量只有有限的隐私)我在使用受保护的变量时没有问题。

标签: java oop inheritance


【解决方案1】:

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

当 getter/setter 有点矫枉过正时,我个人会尽量避免它们。对我来说,它们对于值变量来说太过分了。然而,对于参考变量,它们是一个好主意。

不过,我觉得这里没有对错之分..

【讨论】:

    猜你喜欢
    • 2023-01-13
    • 2013-07-23
    • 2017-01-12
    • 1970-01-01
    • 2013-05-27
    • 2012-10-23
    • 2023-04-09
    • 2014-12-06
    • 2021-09-15
    相关资源
    最近更新 更多