代码之家  ›  专栏  ›  技术社区  ›  Batakj

如何决定定义变量“private”?

  •  14
  • Batakj  · 技术社区  · 15 年前

    我参加了一次面试。面试官问我为什么你需要私有变量。如果通过定义变量私有来实现某件事,那么您不能通过定义Java中定义的任何其他访问修饰符来实现相同的功能吗?

    According to Java Specification Languages,
    
    A private class member or constructor is accessible only within the body of the
    top level class (7.6) that encloses the declaration of the member or constructor.
    It is not inherited by subclasses.
    
    

    但是,如果我正在设计一个类,如何决定定义一个变量“private”?

    9 回复  |  直到 15 年前
        1
  •  40
  •   Kris    15 年前

    通过限制“其他代码”(可能由其他人编写/维护)的访问,您将来可以更自由地更改它,而无需担心破坏其他依赖它的代码。

    问题不是“我应该把这个保密吗?”但更确切地说,“这是否需要非私有化?”.是否有其他代码可能需要访问变量?

    如果事实证明是这样的话,您可以分配适当的访问权限(可能通过getter/setter)并接受对其进行更改是很困难的。否则你就把它保密。

        2
  •  11
  •   GaryF    15 年前

    我认为你应该从另一个角度来看待它:为什么你要把变量变成非私有的?适当的封装意味着隐藏实现的细节,因此默认情况下应将字段设为私有。

        3
  •  8
  •   Konrad Rudolph    15 年前

    基本上,一旦你做了一个变量 public ,你是坚定的,永远不能放弃这个决定。以后的每一个更改都会改变类的公共接口,这意味着该类的每一个用法都需要更改。对于公共API,这是不可想象的;您的库实际上破坏了向后兼容性。

    即使是私人使用的课程,这也是一件大事。

    所以你什么时候能把变量的作用域改成 private 未来?有很多可以想象的原因。最简单的是,类可能需要在每次变量值更改时做一些事情(例如,记录更改,或者相应地更新其他变量)。或者稍后决定根本不需要该变量,而应该动态计算用户请求的值。

    如果您正在直接读取或设置一个变量,那么这是不可能的。相反,您的类需要强制用户调用getter/setter,方法是禁止直接访问变量,并在其位置提供适当的公共getter/setter方法。

    因为一般来说你可以 从未 预见到未来的变化,它已成为公认的最佳做法 变量 公众的 . 每个变量 应该是 私有的 (或至少内部)。

    (有一个例外:在某些情况下, final 变量可以安全地生成 公众的 . 例如,类枚举常量通常实现为 public final Java库中的变量,因为它们永远不会更改,并且不需要访问控制,因为它们无论如何都是只读的。

        4
  •  7
  •   hhafez    15 年前

    一般经验法则是缩小变量和方法的范围。你越是保密,你就越容易改变你的类,而不会在系统的其他部分引起问题(例如:减少耦合)。

    所以作为一般规则,私有应该是默认的

        5
  •  3
  •   aioobe    15 年前

    如果通过定义变量私有来实现某件事,那么您不能通过定义Java中定义的任何其他访问修饰符来实现相同的功能吗?

    对。没错。任何 private 可以更改为 public (或) protected 等等),程序将像以前一样编译和运行。

    访问修饰符的存在是为了程序员的方便,并帮助他正确地定义类的接口。看看 the wikipedia article on encapsulation .

        6
  •  3
  •   Codemwnci    15 年前

    所以,你必须问自己为什么要保密。那么,如何用矛盾的思想来运用真理呢?

    它能公开吗? 如果答案是,您不希望人们能够直接访问和修改该属性,那么它就不能是公共的。

    可以默认吗? 如果答案是,您不希望同一个包能够直接访问和修改属性,那么它就不能是默认值。

    它能被保护吗 如果答案是,您不希望子类直接访问和修改属性,那么它就不能被保护。

    因此,如果所有答案都是“否”(并且您必须确定在这些场景中为什么不希望访问的答案),那么它必须是私有的。

    问题是,你真的了解修饰符给你的是什么,以及如何访问修饰符,而不是盲目地将所有东西都私有化,并创建设置者和获取者,因为这就是你的讲师/书/手册教给你的。

        7
  •  2
  •   Vladimir Ivanov    15 年前

    在以下情况下,成员是私有的:

    1. 它是一个属性,它的读和写只能通过类方法执行
    2. 它只有在对象的上下文中才有意义,其他地方都没有。
    3. 从课堂外看不到

    这种设计的对象是封装,这意味着您将类实现隐藏在客户机代码中。它提高了代码的可读性、可维护性和可测试性。

        8
  •  1
  •   Peter Knego    15 年前

    类的主要目的是封装数据和行为并隐藏内部实现,同时在外部公开干净、简单和有用的API。

    有两个不同的问题需要考虑:公共契约(API)和私有数据。

    1. 私有字段:这是您的私有数据,您不希望对外公开,因为:安全性和完整性。

    2. 私有方法:您的实用程序的功能是使代码更易于阅读和维护。

    3. 公共方法:向其他人公开的契约(接口、API)。这就是使你的课程有用的原因。

    4. 公共领域:不要使用这个。它只公开内部数据的一部分。对于简单的类可能是可以的,而对于具有相互依赖字段的复杂类,这是一个很大的禁忌。对于公开功能,您应该使用公共方法(第3点)。

        9
  •  0
  •   Peter Lawrey    15 年前

    其中许多注释应用于内部/嵌套类、方法和构造函数。

    基本上,您希望在不造成过度复杂性的情况下尽可能限制访问。如果你能使一些私人或静态的东西,我建议你。如果你能让一个领域最终,这通常也有助于提高清晰度。

    当一个字段或任何成员是私有的时,您可以立即看到它在何处使用以及何时不再使用。