Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 返回及;打印字段值还是仅通过类方法打印值?_Java_Oop_Encapsulation_Getter_Single Responsibility Principle - Fatal编程技术网

Java 返回及;打印字段值还是仅通过类方法打印值?

Java 返回及;打印字段值还是仅通过类方法打印值?,java,oop,encapsulation,getter,single-responsibility-principle,Java,Oop,Encapsulation,Getter,Single Responsibility Principle,我目前正在学习Java和学习,我不确定以下哪项是更好的实践: 使用getter将字段值从一个类返回到另一个类,然后通过另一个类中的方法打印它 从另一个类调用一个类中的方法以打印字段的值 该值不被操纵,仅通过System.out.println()显示 如有任何建议,将不胜感激:) 编辑:一个类(Person)保存有关人员的信息,如姓名、年龄、体重等,另一个类(Directory)有一个方法,用于在人员的LinkedList中搜索以查找具有匹配年龄的对象。如果找到一个人,那么该方法将打印出此人的姓

我目前正在学习Java和学习,我不确定以下哪项是更好的实践:

  • 使用getter将字段值从一个类返回到另一个类,然后通过另一个类中的方法打印它
  • 从另一个类调用一个类中的方法以打印字段的值
  • 该值不被操纵,仅通过System.out.println()显示

    如有任何建议,将不胜感激:)


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

    我的建议是使用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()
    方法也添加到类中。这确实是一个上下文敏感的问题。如果不知道实际情况,我无法给出更具体的答案


    祝你好运

    封装就是要维护一个类,其核心思想是一个类应该尽可能少地了解其他类的工作方式,部分原因是您可以更改这些类,而不必更改与它们交互的其他类

    概括地说:根据经验,您希望您的每个类都做“它自己的小事情”——有自己的小关注点,所有用于做小事情的逻辑都封装在该类的私有方法中。如果其他类在做自己的小事情的过程中需要从第一个类了解一些事情,那么您可以在该类中提供getter方法来公开这些事情,而不公开它们如何在内部实现的细节

    关于你的问题,你提到的选项实际上是一样的:getter是一个被其他类调用以返回字段值的方法。这种方法的优点是,它将该字段封装在包含该字段的类中,然后该类可以解析/重新计算/存储该字段,或者以其他方式与该字段进行交互,只要该字段返回预期的数据类型即可

    为了举例说明,假设您创建了一个带有
    双余额
    字段的
    银行账户
    类。您做了一些测试,它似乎工作得很好,所以您创建了几个其他类来引用这个
    balance
    字段。在某个时刻,您会注意到您的一些计算结果会减少几美分。您做了一些研究,发现使用
    double
    存储货币值是一种不好的做法,您应该使用一个名为
    BigDecimal
    的类

    如果您的其他类直接访问您的
    余额
    字段,则它们都必须更改(并且所有类都必须导入
    BigDecimal
    ,即使它们从未直接使用它),以便进行此更改。另一方面,如果他们通过getter方法访问帐户的
    余额
    ,您可以在
    银行帐户中将
    余额
    的类型更改为
    大十进制
    当将
    getBalance()
    的返回类型保留为
    double
    时,通过调用
    bigdecimic
    toDouble()
    方法来返回
    double
    值,您的其他类都不会知道您更改了数据类型

    说明关注点分离思想的另一种方式是,每个类都应该有一个更改的理由(这是@GregKopff注释中引用的):需要更改
    余额
    字段的数据类型是
    银行账户
    更改的有效理由,但这是一个有效的理由,还是所有其他与之交互的类都需要改变?由于
    账户
    类中的技术细节发生了更改,您是否必须更改
    银行账户持有人
    银行员工

    这似乎不能直接回答你的问题,但我认为这个问题的唯一答案通常是说明你应该问自己的问题,每次遇到它时都要回答它。。。几乎每次你写一个类的时候都会发生这种情况


    如果我的说明不清楚,请让我知道如何澄清:您提出了一个重要的问题,重要的是您掌握了问题的答案(以及您提出的问题)。

    写入控制台可能不是包含字段的类的责任,因此我将提取并打印它(请参阅:)。通常,您可以同时实现这两个。已将上下文添加到OP