使用没有setter的getter

see*_*ess 2 java

这似乎是一个已经问过的问题,但我找不到以这种特定方式提出的问题.我不明白添加setter如何改进此代码.我知道添加setter是标准做法,但我不明白为什么.

public class DataHelper extends Activity {

    private final double cards = 52;

    public double getCards(){
        return cards;
    }
Run Code Online (Sandbox Code Playgroud)

Sto*_*ica 7

因为cards就是final在这里添加一个设置是没有意义的:这个字段不能改变.

如果不是final,但你不想允许外部修改,那么添加setter将毫无意义.

如果在您的设计中有意义,则只需添加一个setter,以允许对字段进行外部修改.

至于为什么添加一个setter而不是直接修改一个字段的问题,答案就是封装.通过仅通过方法提供访问权限,您可以在不影响用户的情况下更改基础实现.

一个更好的例子是一个Font类.字体的一个共同特征是大小可以是像素或点.如果内部表示以点为单位,并将其作为字段公开,那么稍后如果需要将内部表示更改为像素,则不能在不影响所有当前用户的情况下进行.相反,如果您提供了一个setter,那么您可以自由地更改内部表示而不会影响任何人.

提供方法而不是直接访问字段会使选项打开,以便稍后修改类的内部,而不会影响用户.这是很好的封装,信息隐藏.