ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java 防止内部成员变量外部泄露的措施

2021-07-04 22:32:46  阅读:152  来源: 互联网

标签:Java 变量 外部 方法 成员 修饰 泄露 final


做Lab2时最大的收获是关于防泄漏方面的方法和思想。有必要写一点东西记录一下。

其实在此之前我本以为类内部的成员变量暴露给外界是无所谓的。去年暑假的java语言课我写的所有类成员变量全部是public修饰的,自认为这样在类外部可以直接引用查看更加方便。现在想想还是当时还是所知甚少。

Java语言一个很大的特性就是取消了指针类型,这也导致Java中除基本数据类型(int等类型)之外所有类型作为参数传递时传递的是引用(其实个人理解传递的全都是指针地址)而不是一个类的副本。如果某个可变类作为成员变量被暴露在外部,那么这个成员变量在外部可谓是一丝不挂的,外部可随意操纵、修改它,如果有人怀有恶意那么后果可想而知了。所以一定加以保护。

首先是成员变量的权限修饰词,非特殊情况成员变量一致用private修饰,仅限类内部直接使用,如果外部需要查看,则单独写一个observer方法专门返回这个变量的值。

再者就是用final修饰。这个修饰词对于基本类型(int、boolean等)的后果是一旦赋值后便不能再修改,无论是内部还是外部。对于一些可变类(List Set),这些类无法在外部被引用,内部可以直接使用或修改。而对于成员方法,用final修饰就代表无法被子类继承(断子绝孙方法)。所以一般情况下可变类成员变量都要用final修饰一下,基础类型变量视情况而定,如果在类中以一种条件常量存在,完全可以用final修饰。final这个修饰词还是非常安全的。

最后是关于成员方法返回值的问题。如果成员方法返回的是基础类型值,那么没有问题,因为这类值传递的不是引用,无伤大雅。但如果返回的是可变类,那么就有问题了。如果一个observer方法把可变类成员变量返回到外部,那么外部实际上还是得到了这个类的引用,即使用了final修饰仍然是非常危险的。所以我们在返回前要做一些安全性处理。
一种方法是使用Collections.unmodifiableXXX()方法加固返回变量。使用这个方法处理后可变类若在外部遭到修改,那么系统立马会抛出异常。
另一种方法是手动复制,在局部定义一个同类型的类,然后将所有信息复制到这个新类中作为副本返回,这样就直接避免了成员变量地址的暴露。

以上就是在实验过程中用到的所有措施,这种安全性的编程思想在以后非常关键。

标签:Java,变量,外部,方法,成员,修饰,泄露,final
来源: https://blog.csdn.net/Prototypen/article/details/118468525

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有