为什么java需要getter/setter来获取私有属性

和直接访问属性相比,我们可以在getter和setter实现不同的控制权限(modifier),比如说private的setter和public getter。我们还可以在getter和setter里实现额外的逻辑。

和直接访问属性相比,我们可以在getter和setter实现不同的控制权限(modifier),比如说private的setter和public getter。我们还可以在getter和setter里实现额外的逻辑,比如说:

public void setCounter(int c) { if (c < 0) { throw new IllegalArgumentException(); } this.counter = c; }

  这样做还有一个好处就是外部调用者是和getter和setter方法耦合,我们将来可以把这个类变成interface,你可以加入不同的实现类,比如说DBCounter, MemoryCounter,只要仍然向外暴露同样的getter和setter,调用方就无需改变。

但现在getter和setter泛滥并不是因为这些好处,而是非常多的框架spring,struts,hibernate等依赖这种模式。

因为这个模式其实有个历史原因,就是javabean,这是从jsp/servlet时代就开始有的概念,后来被非常多的Java 框架继承。在很多框架中以pojo的形式出现, 它就是一堆属性加上getter和setter再带一个无参数的constructor,它被很多很多老框架广泛采用,用于在不同层面传递数据,

但这个真的不是一个好设计,如果是来做model,你把所有私有属性都暴露出来,这明显是破坏了封装。如果仅仅是在不同层面传递数据,那我觉得不可更改的对象似乎更适合。有setter的对象很容易产生问题,有些值不对的时候,你都不知道在哪改的,也不好debug。

另外在并发情况下,我比较推荐使用immutable(内部状态无法再修改的)的对象,用一个constructor来初始化所有field, 然后只提供getters。这样至少能保证每一个bean初始化出来都是完整的。传统javabean你初始化需要调用一大组setter, 万一中间出现异常,你这个bean很可能处在一种不可预计的状态中,是很危险的。有朋友说,有的框架一定要依赖setter来赋值,的确有这种情况,那我想不出什么更好的办法,似乎这种情况下setter不能避免。但即便有setter,你自己的代码里也可以不调用setter. 因为mutable的坏处聊起来没底的。

延伸阅读

java getter和setter作用是什么

get和set就是java中的封装技术。首先我们需要知道,一旦一个变量被“private”私有化了,那么在其他类文件就不能引用(使用)它。使用“private”是把被使用的变量保护起来,使别人不知道这个变量的名称是什么,有保护的作用。

而set和get就是在和“private”私有化的变量在同一个类文件中,set和get是“public”共有的,也就是说这两个方法是可以被在其他类文件中使用的。set方法的意思是定义一个方法含一个参数,把所含有的这个参数(后期自己设置)赋给你需要私有化的变量(在当前类中设置),相当于充当媒介,外界想要改变已经“private”私有化的变量,必须要在其他类文件中给方法set一个参数,通过set变量来更改。

set的名字可以随便取,如此一来其他类中根本不知道在另一个类中“private”私有化的变量名称,也不能直接更改。get则是获取这个私有化的变量值。是定义了一个带返回类型的方法,这个返回类型就是已经被你私有化变量的类型。以题目为例,你私有化了String类型的name,那么get方法的返回类型就是String类型,同时返回当前类中name的值。

这样一来在其他类文件中,可以通过set方法来给和更改另一个类中的加密变量值,可以通过get来获取另一个类中加密的变量值,而这个被加密的变量则变量名始终没有人知道。

文章标题:为什么java需要getter/setter来获取私有属性,发布者:小编,转载请注明出处:https://worktile.com/kb/p/37435

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023年2月8日 下午1:43
下一篇 2023年2月8日 下午2:16

相关推荐

  • oa系统和erp系统区别是什么

    oa系统和erp系统区别是:1、含义不同;2、包含功能不同;3、目的不同;4、服务对象不同。含义不同是指,OA指Office Automation,中文简称自动办公系统;ERP指Enterprise Resource Planning,中文简称企业资源计划。 一、含义不同 OA指Office Aut…

    2023年4月20日
    2400
  • logo设计理念

    logo设计理念:1、简单易懂;2、传达品牌理念;3、注重结构;4、了解充分;5、遵循艺术规律;6、特异性和可识别性。简单易懂是指,简单易懂的设计更易于记忆,有更高的辨识度。这种简单性用途广泛,包括让logo更有效适用于不同尺寸。 1、简单易懂 简单易懂的设计更易于记忆,有更高的辨识度。就像苹果、耐…

    2023年3月21日
    8900
  • 什么叫知识结构化

    所谓知识结构化,就是将学到的知识,加以归纳和整理,使之有一定的秩序和结构。通俗来讲,也就是让知识与知识间产生关联,让知识之间通过一定的关系结合在一起,用基本知识点组成小结构,小结构组成大结构,形成知识结构体系。 一、什么叫知识结构化 所谓知识结构化,就是将学到的知识,加以归纳和整理,使之有一定的秩序…

    2023年4月24日
    4600
  • 在java中 this和super的区别

    在java中 this和super的区别有:1、属性的区别;2、方法的区别;3、构造的区别;4、其他区别。属性的区别是指this访问本类中的属性,如果本类没有这个属性则访问父类中的属性。super访问父类中的属性。 1、属性的区别 this访问本类中的属性,如果本类没有这个属性则访问父类中的属性。 …

    2023年2月7日
    16800
  • 编程语言是否区分大小写是出于什么考虑

    编程语言区分大小写是因为:1、可读性;2、语法规则;3、兼容性;4、标识符的区分;5、防止命名冲突。区分大小写可以提高代码的可读性。在编写代码时,我们通常会使用具有意义的标识符来表示变量名、函数名等。如果不区分大小写,那么相似的标识符可能会被误解为同一个标识符。 一、可读性 首先,区分大小写可以提高…

    2023年3月19日
    1400
  • 编程算法和数据挖掘涉及的算法有什么区别和联系

    区别是:编程算法不依赖于数据,能精确的解决问题,是对存储的数据进行处理,最终得到问题的答案。数据挖掘算法是一类从数据中运用数学工具自动分析获得规律,并利用规律对未知数据进行预测的算法,注重数据来源以及数据规律。 编程算法不依赖于数据,能精确的解决问题,是对存储的数据进行处理,最终得到问题的答案。数据…

    2023年2月21日
    3300
  • 线程和进程的区别是什么

    线程与进程的区别如下:1、进程是资源分配的最小单位,线程是资源调度的最小单位;2、2、线程是在进程下运行的。一个进程可以包含多个线程;3、进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间。 一、区别 1、进程是资源分配的最小单位,线程是资源调度的最小单位。 2、线程是在进程下运行的…

    2023年2月13日
    1400
  • 产品里程碑是什么意思

    产品里程碑就是项目里程碑,意思是指项目中的重大事件,在项目过程中不占资源,是一个时间点,通常指一个可支付成果的完成。编制里程碑计划对项目的目标和范围的管理很重要,协助范围的审核,给项目执行提供指导。 项目里程碑(milestone)并没有形成统一的定义,但是各个定义的核心基本上都是围绕事件(even…

    2022年11月16日
    28900
  • mybatis和hibernate区别大不大

    mybatis和hibernate区别较大,主要在以下几点有区别:1、本质区别;2、开发难度对比3、sql书写比较;4、数据库扩展性比较;5、缓存机制比较。针对高级查询,Mybatis需要手动编写SQL语句以及ResultMap。而Hibernate有良好的映射机制,开发者无需关心SQL的生成与结果…

    2023年2月12日
    4200
  • 任务跟踪工具有哪些

    任务跟踪工具有:一、PingCode;二、Worktile;三、Taiga;四、OmniPlan;五、MeisterTask;六、Jira。PingCode的优势在于它是一款覆盖研发全生命周期的项目管理系统,被广泛用于需求收集、需求管理、需求优先级、产品路线图、项目管理、测试管理、缺陷追踪、文档管理…

    2023年4月16日
    2800

发表回复

登录后才能评论
联系我们
站长微信
站长微信
分享本页
返回顶部