“受保护”和“公共”的可见性对于课堂领域是否无用?

时间:2012-03-28 15:19:03

标签: java oop encapsulation

encapsulationprivate字段与访问者(getter和setter)一起使用,而不是protectedpublic字段,这被视为最佳做法。

因此,通过遵循此最佳做法,我们再也不会使用protectedpublic。他们变得无用,或者他们的用例是什么?

我唯一能想到的是公共static final属性(即类常量)。

注意:Java世界中至少有这种情况,但问题代表所有语言。

7 个答案:

答案 0 :(得分:3)

就内部领域而言?是的,在很多情况下它们都没用。 (如果你希望有子类,有时protected是可以接受的。)public static final属性也完全可以。

尽管如此,publicprotected 方法是绝对必要的。

答案 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不能这样做。