encapsulation将private
字段与访问者(getter和setter)一起使用,而不是protected
和public
字段,这被视为最佳做法。
因此,通过遵循此最佳做法,我们再也不会使用protected
和public
。他们变得无用,或者他们的用例是什么?
我唯一能想到的是公共static final
属性(即类常量)。
注意:Java世界中至少有这种情况,但问题代表所有语言。
答案 0 :(得分:3)
就内部领域而言?是的,在很多情况下它们都没用。 (如果你希望有子类,有时protected
是可以接受的。)public static final
属性也完全可以。
尽管如此,public
和protected
方法是绝对必要的。
答案 1 :(得分:2)
最佳做法可能会随着时间的推移而发生变化 我可以在公共领域的两个用例中思考,两者都有争议 Adam Bien说in this post如果你使用的是DTO,你可能不会使用私人+ getter + setter而只使用公共字段。这样您就可以确保数据按原样传输,而无需任何更改。但在同一行中他补充说,这将花费你很多会议来解释你为什么这样做......
非常量公共字段的另一个用途是使用公共最终字段(在构造函数中初始化)以确保不变性。让你的课程像
public Person{
public final String lastName;
public final String firstName;
public Person(String firstName, String lastName){
this.firstName = firstName;
this.lastName = lastName;
}
}
是某种新的最佳做法,在codemonkeyism等地方提供建议。
但除非您是代码的绝对所有者和/或您可以强制实施新标准,否则您应该继续避免使用公共/受保护字段......
答案 2 :(得分:1)
“无用”是旁观者的眼睛。一些“最佳实践”被高估了:
假设您需要等效的C风格结构,基本上是一个只保存一堆数据的无方法类。只有一个带有公共字段的类比带有一堆getter和setter的类更方便和可读。
假设您想要访问永不改变的值(如数组的长度)public final
字段是完美的。此外,拥有一个“常量”类除了public static final
字段之外什么都是非常常见的。有无数标准库类具有public static final
字段。实际上,几乎每次你想要一个公共常量时都可以使用它。
protected
字段非常罕见,AFAIK。你真的需要计划让一个子类具有远见并且需要使用protected
。
答案 3 :(得分:1)
在工程中,“最佳实践”是指一般指导原则。在所有情况下,使用getter和setter并不是最好的。例如,如果要创建BST,那么将Node类的字段声明为public(即数据,左,右)则要简单得多;因此,BST中的方法更易于读写。同样,因为直接访问在某些情况下更简单,您可以使用protected来直接访问子类,同时拒绝访问公共..
答案 4 :(得分:0)
好吧,我仍然看到很多public static final
字段,这对我来说很有意义 - 因为它们是常数。除了那个(以及一些protected
个案例 - 但总是需要小心),我认为很少见(并且你应该有一些很好的理由我不能想到制作一个字段{{1至少而不是public
。
然而,我也认为使用吸气剂/定型器应该限制在最小的必需品 - 我过去看到人们把吸气剂放在每个区域 - 即使不需要。
答案 5 :(得分:0)
有时候内部常量只允许子类使用,那么你可能需要protected
修饰符而不是为这些常量创建getter。
这适用于允许子类直接访问的字段,不会向外部公开。
答案 6 :(得分:0)
public,private,protected和package不仅限于字段。
在方法和构造函数上有很多有用的应用程序。
但是,尝试将字段仅限制为私有范围是不一致的,因为在嵌套/内部类的情况下java不能这样做。