【发布时间】: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