【问题标题】:Return & print field value or just print value through class method?返回并打印字段值还是仅通过类方法打印值?
【发布时间】:2014-05-02 03:49:39
【问题描述】:

我目前正在学习 Java 并了解 encapsulation,但我不确定以下哪种做法更好:

  1. 使用 getter 将字段值从一个类返回到另一个类,然后通过另一个类中的方法将其打印出来。
  2. 从另一个类调用一个类中的方法来打印字段的值。

该值没有被操纵,仅通过 System.out.println(); 显示

任何建议将不胜感激:)

编辑:一个类 (Person) 保存有关人的信息,例如姓名、年龄、体重等,而另一个类 (Directory) 具有用于搜索人的 LinkedList 以查找具有匹配年龄的对象的方法。如果找到一个人,则该方法会打印出该人的姓名。

【问题讨论】:

  • 包含字段的类可能不负责写入控制台 - 所以我会提取并打印它(参考:Single Responsibility Principle)。
  • 一般来说,两者都可以实现。

标签: java oop encapsulation getter single-responsibility-principle


【解决方案1】:

封装就是维护一个separation of concerns,其核心思想是一个类应该尽可能少地了解其他类是如何工作的,部分原因是您可以对这些类进行更改而不必更改其他类与他们互动。

概括地说:根据经验,您希望您的每个班级都做“自己的小事”——拥有自己的小关注,以及进入的所有逻辑 在该类的私有方法中封装这件小事。如果其他类在做他们自己的小事情的过程中需要从第一个类中了解事情,那么您在该类中提供 getter 方法来公开这些事情而不暴露它们的详细信息内部实施。

关于您的具体问题,您提到的选项实际上是同一件事:getter 一种被其他类调用以返回字段值的方法。这种方法的优点是它封装包含它的类中的字段,然后它可以解析/重新计算/存储或以其他方式与该字段交互,只要它是@987654323 @ 返回预期的数据类型。

为了说明,假设您创建了一个带有double balance 字段的BankAccount 类。你做了一些测试,它似乎工作正常,所以你创建了几个引用这个balance 字段的其他类。在某些时候,您会注意到您的一些计算结果降低了几美分。您做了一些研究,发现使用double 来存储货币值是一种不好的做法,您应该改用一个名为BigDecimal 的类。

如果您的其他类直接访问了您的 balance 字段,则它们都必须进行更改(并且所有人都必须导入 BigDecimal,即使他们从未直接使用它)以促进这种更改。另一方面,如果他们通过getter方法访问帐户的balance,您可以在BankAccount中将balance的类型更改为BigDecimal 在将getBalance() 的返回类型保留为double 的同时,通过调用BigDecimaltoDouble() 方法返回您其他类期望的double 值:您的其他类都不会知道您已经更改了数据类型。

另一种表述关注点分离概念的方式是说每个类都应该有一个改变的理由(这是@GregKopff 的评论中引用的single responsibility principle):需要改变balance 字段的数据类型是 BankAccount 更改的正当理由,但它是正当理由还是与它交互的所有其他类都发生了变化?您是否必须因为 Account 类中的技术细节发生更改而更改您的 BankAccountHolderBankEmployee 类?

这似乎不能直接回答你的问题,但我认为这个问题的唯一答案一般来说是为了说明你应该问你自己来回答它的问题每次你遇到它......几乎每次你写一堂课都会发生这种情况。

如果我的插图不清楚,请告诉我如何澄清:您提出了一个重要问题,重要的是您要掌握答案(以及您要问的内容)。

【讨论】:

    【解决方案2】:

    我的建议是使用 Getter 和 Setter。 Getter 是返回各自字段值的公共方法。 Setter 是设置各自字段值的公共方法。

    public class YourClass {
        private String yourMember;
    
        public String getYourMember() {
            return this.yourMember;
        }
        public void setYourMember(String member) {
            this.yourMember = member;
        }
    }
    

    并使用这些方法来获取或设置变量的值。

    public class AnotherClass {
        public void someMethod() {
            YourClass yc = new YourClass();
            yc.setYourMember( "Value" );
            System.out.println( yc.getYourMember() );
        }
    }
    

    但是如果打印值是类行为的一部分,那么最好在类中添加一个printYourMember() 方法。这确实是一个上下文相关的问题。在不了解实际情况的情况下,我无法给出更具体的答案。

    祝你好运!

    【讨论】:

    • 在 OP 中添加了上下文
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    相关资源
    最近更新 更多