Java中为什么要将healthpoints属性设置为private修饰?
这里用private修饰healthpoints的核心意义是把属性的读写控制权完全掌握在Hero类内部,避免外部随意修改导致不符合预期的问题,你觉得和public效果差不多是因为当前示例的set逻辑非常简单,实际开发中两者的差异会非常明显,核心优势有这几点:
强制校验规则,杜绝非法值
如果把
healthpoints设为public,外部可以直接绕开你写的构造、set方法里的校验规则,随便赋值:Hero player = new Hero(80); player.healthpoints = 9999; // 直接突破100的血量上限,没有任何校验 player.healthpoints = -100; // 出现不符合逻辑的负血量,你完全无法拦截用private修饰后,外部只能通过你提供的
setHealthpoints、构造方法修改血量,所有修改都会经过你预设的校验规则,从根源上避免非法值的出现。降低后续维护成本
后续如果要修改血量相关的逻辑,你只需要改
Hero类内部的方法即可,不需要修改任何外部调用的代码:
比如后续要加规则:扣血时优先扣除护盾值,护盾扣完再扣血量,你只要修改setHealthpoints的内部逻辑就行,之前所有调用player.setHealthpoints(damage)的代码完全不用调整。
如果是public属性,你需要全局搜所有直接修改healthpoints的地方一个个改,非常容易漏改出bug。可控的读写权限
你可以自行决定属性对外暴露的程度:比如后续不想对外返回具体的血量数值,只想返回「满血/半血/残血」的状态,你只要修改
getHealthpoints的逻辑即可,外部拿不到原始的血量数值。如果是public属性,外部早就直接读取原始值做了其他逻辑,你根本没法修改暴露规则。
简单来说,private+公共读写方法的组合,就是给类的属性加了一层可控的「防护层」,所有对属性的操作都必须经过你预设的逻辑,不会出现外部随意篡改属性导致的不可预期问题,这也是面向对象封装特性的核心体现。
内容的提问来源于stack exchange,提问作者Vincenzo
相关产品推荐
相关产品推荐

