Java 您如何决定定义一个变量;私人的;?

Java 您如何决定定义一个变量;私人的;?,java,encapsulation,private-members,Java,Encapsulation,Private Members,我参加了一次工作面试。面试官问我为什么你需要私人变量。如果您通过定义一个变量private来实现某些功能,那么您不能通过定义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 t

我参加了一次工作面试。面试官问我为什么你需要私人变量。如果您通过定义一个变量private来实现某些功能,那么您不能通过定义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. 根据Java规范语言, 私有类成员或构造函数只能在 包含成员或构造函数声明的顶级类(7.6)。 它不是由子类继承的。 但是,如果我正在设计一个类,我如何才能决定定义一个变量“private”?

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

问题不是“我是否应该将其私有化?”,而是“是否有必要将其非私有化?”。是否有其他代码可能需要访问该变量


如果事实证明是这样,那么您可以分配适当的访问权限(可能通过getter/setter),并接受对其进行更改将是困难的。否则,您可以将其保留为私有。

一般的经验法则是减少变量和方法的范围。私有的东西越多,就越容易更改类,而不会在系统的其他部分引起问题(即:减少耦合)


因此,作为一条一般规则,private应该是默认值

我认为您应该从另一个方向来看待它:为什么要将变量设为private以外的任何东西?适当的封装意味着隐藏实现的详细信息,因此默认情况下应将字段设置为私有。

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

  • 它是一个属性,它的读写只能通过类方法执行
  • 它只有在对象的上下文中才有意义,其他任何地方都并没有意义
  • 它不应该在课堂外可见

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

    因此,您必须问问自己,为什么它必须是私有的。那么,用矛盾的观点来运用真理又如何呢

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

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

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

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

    问题是,你真的明白修饰符给了你什么,以及它们是如何被访问的吗?不要盲目地把每件事都私有化,创建setter和getter,因为这是你的讲师/书籍/手册教给你的

    如果您通过定义一个变量private来实现某些功能,那么您不能通过定义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
    都可以更改为
    public
    (或
    protected
    等),程序将像以前一样编译和运行


    访问修饰符是为了方便程序员,并帮助他们正确定义类的接口。请看。

    这些注释中有许多适用于内部/嵌套类、方法和构造函数

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


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

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

    有两种不同的东西需要考虑:公共合同(API)和私有数据

  • 私有字段:这是您的私有数据,您不希望将其暴露在外部,因为:安全性和完整性

  • 私有方法:您的实用程序的功能是使代码更具可读性和可维护性

  • 公共方法:向其他人公开的契约(接口、API)。这就是使您的类变得有用的原因

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


  • 基本上,一旦你将一个变量
    公开
    ,你就承诺了,并且永远不能违背这个决定。将来的每一次更改都会更改类的公共接口,这反过来意味着该类的每个用法都需要更改。对于一个公共API来说,这是不可想象的;您的库实际上破坏了向后兼容性

    即使对于私人使用的类,这也是一件大事

    那么,您将来什么时候会将变量的范围更改为
    private
    ?有很多可以想象的原因。最简单的是,每次变量的值更改时,您的类可能需要执行某些操作(例如,记录更改,或相应地更新其他变量)。或者您稍后决定根本不需要该变量,而应该动态计算用户请求的值

    如果您直接读取或设置一个变量,这是不可能的。我