我应该使用永远不会改变的字段值的访问器吗?

rth*_*sen 5 java oop encapsulation

我们以这堂课为例:

public class Student{
    private String name;
    private String id;

    public Student(String name, String id){
        this.name = name;
        this.id = id;
    }

    ... getters and setters for both fields
Run Code Online (Sandbox Code Playgroud)

并将其与此进行比较:

public class Student{
    public final String name;
    public final String id;

    public Student(String name, String id){
        this.name = name;
        this.id = id;
    }
 }
Run Code Online (Sandbox Code Playgroud)

我认为不需要访问者.
这会被认为是糟糕的OO设计吗?

edt*_*ird 7

这是一个有问题的问题.

不幸的是,好(或坏)设计100%取决于它的使用方式.

根据经验,最好将成员变量保持为私有,这样Object模型就可以控制它们的访问.这意味着第一种方法更好.

如果价值观永远不变,重点是什么?如果他们永远不会被使用,为什么还要编写setter 呢?

那么,哪一个更好?正如我上面提到的,这取决于你为此做了什么.如果它是为了课程的作业,我会选择第一个.你的老师会更喜欢这样,因为它更像是"教科书".

所以,如果这是一个个人项目或者你可以利用未来版本的工作,我会在两者之间进行交叉:

public class Student{
    private final String name;
    private final String id;

    public Student(String name, String id){
        this.name = name;
        this.id = id;
    }

  ... getters ONLY for both fields
Run Code Online (Sandbox Code Playgroud)

这种方法是安全的,因为成员字段是私有的,并且没有未使用方法的"代码味道".这也是相当可扩展的,因为如果您的需求发生变化并且您需要修改字段,则可以非常轻松地添加setter.


ass*_*ias 6

你应该始终致力于将可变性和范围限制在最低限度.在你的情况下:将字段设为私有,最终,使用getter,不设置setter.

额外奖励:您的班级将变为不可变且线程安全.

另见这篇文章.