【问题标题】:Correct hierarchy in Java with correct Class modifiers for getters and setters methods正确的 Java 层次结构,并为 getter 和 setter 方法使用正确的 Class 修饰符
【发布时间】:2016-06-22 08:00:15
【问题描述】:

一无所有,

我的问题与这些类似: get super class value in java Getting the name of a sub-class from within a super-class

但不能解决我的问题。所以,我要解释一下。我希望不要重复一个话题...

我正在创建一个层次结构。此层次结构仅适用于具有 getter 和 setter 的对象。仅用于演出信息。

好吧,我想正确地执行我的层次结构,但不使用修饰符做一些不合逻辑的事情。这是我的类的简化示例,不完全是 Java 是伪代码:

Class A
    private id;

Class B extends A
    private dataB;

Class C extends A
    private dataC;

变量“id”在 B 类和 C 类中很常见。因为 B 和 C 扩展了 A。 我在想我永远不会将 A 类用于显示数据,只使用 B 和 C,就像 A 是抽象类一样。

我的问题是:

我不知道是否正确将方法 getter 和 setter 放入类 A 中并使用修饰符 public 并使用类 B 和 C 中的此方法,因为层次结构是正确的,是合乎逻辑的,但数据“id”未正确封装.

Class A
    private id;
    private name;
    private age;

    public getId(){...}
    public getName(){...}
    public getAge(){...}

Class B extends A
    private dataB;

    public getDataB(){...}

Class C extends A
    private dataC;

    public getDataC(){...}

要访问我的对象,我想这样做:

B.getDataB();
B.getId();
B.getName();
B.getAge();

C.getDataC();
C.getId();
C.getName();
C.getAge();

这可行,但 A 类的所有方法都必须是公共的,变量没有正确封装。

还有其他方法可以做到这一点吗? 这是最好/最坏的方式吗? Getter 和 setter 可能是“跳跃”修饰符逻辑的例外?

我希望你能理解我的例子和我的“英语”。

先谢谢你了。

【问题讨论】:

  • 您要解决的问题是什么? B和C应该继承A的方法。使用getter/setter是一种实现封装的策略。
  • 类的私有属性不会被子类继承。因此,您显然必须在子类中使用 getter 和 setter。如果你想从子类中直接访问私有变量,比如“id”,你需要将它们声明为受保护的。

标签: java hierarchy hierarchical-data getter-setter


【解决方案1】:

关于getter/setter有一个非常简单的规则:

如果您在类A 中声明变量getter/setter 应该在类A 中提供。如果您需要子类中的任何突变,请覆盖。

这使代码更具可读性和易于调试。

顺便说一句,您不能在除A 类之外的任何地方编写id 的getter/setter,因为它是私有的。所以,在这种情况下,上述理论也符合。

【讨论】:

  • 好的,我明白了。如果我总是对方法 getter 和 setter 使用“受保护”修饰符,我总是可以从子类和孙类中使用这些方法。
  • yah.. 但最好将 setter/getter 公开,除非您有任何理由对其进行保护。我说的是简单的 Java bean 类
  • 你说的话让我思考......我搜索了一些文档,发现了这个:[link]docstore.mik.ua/orelly/java-ent/jnut/ch06_02.htm[/link]
    6.2.7。方法 beanbox 可以向应用程序设计者公开 bean 的方法。唯一的正式约定是这些方法必须声明为公共的。但是,以下指南也很有用:
  • The only formal convention 这就是我所说的。我很高兴你找到它。
【解决方案2】:

简单来说, 您可以将变量声明为private。但是相关的getter/setter必须是公开的。

希望对你有所帮助。

其实我们用getter和setter来做

  • 可重用性
  • 在编程的后期执行验证
  • Getter 和 setter 方法是访问私有的公共接口 班级成员。

封装过程: 封装过程为to make fields privatemethods public

Getter 方法:我们可以访问私有变量。

Setter 方法:我们可以修改私有字段。

即使getter and setter methods 没有添加新功能,我们也可以改变主意稍后返回以使该方法saferfaster

【讨论】:

    【解决方案3】:

    实现封装的方式有很多种。

    1. 最好的方法是在基类中创建公共方法来访问私有数据成员。这就是你申请的。
    2. 另一种方法是使您的基类成员受保护,并在子类(继承它们)中设置公共方法来获取和设置它们。

    据我所知,其他 JAVA 书籍作者如 Paul Deitel 更喜欢第一种方法来实现最大程度的封装。

    【讨论】:

    • 好吧,我打算用第一个,我觉得更好。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-07
    • 1970-01-01
    • 2014-08-06
    相关资源
    最近更新 更多