java安全编码指南之:方法编写指南

简介

java程序的逻辑是由一个个的方法组成的,而在编写方法的过程中,我们也需要遵守一定的安全规则,比如方法的参数进行校验,不要在assert中添加业务逻辑,不要使用废弃或者过期的方法,做安全检查的方法一定要设置为private等。

今天我们再来深入的探讨一下,java方法的编写过程中还有哪些要注意的地方。

不要在构造函数中调用可以被重写的方法

一般来说在构造函数中只能调用static,final或者private的方法。为什么呢?

如果父类在执行构造函数的时候调用了一个可以被重写的方法,那么在该方法中可能会使用到未初始化的数据,从而导致运行时异常或者意外结束。

另外,还可能到方法获取到未初始化完毕的实例,从而导致数据不一致性。

举个例子,我们定义了一个Person的父类:

public class Person {public void printValue(){System.out.println("this is person!");}public Person(){printValue();}
}

然后定义了一个Boy的子类,但是在Boy子类中,重新了父类的printValue方法。

public class Boy extends Person{public void printValue(){System.out.println("this is Boy!");}public Boy(){super();}public static void main(String[] args) {Person persion= new Person();Boy boy= new Boy();}
}

输出结果:

this is person!
this is Boy!

可以看到Boy调用了自己重写过的printValue方法。

注意,这里并不是说会产生语法错误,而是这样会导致业务逻辑看起来非常混乱。

怎么解决呢?简单办法就是将Person中的printValue置位final即可。

不要在clone()方法中调用可重写的方法

同样的,我们在定义clone方法的时候也不要调用可重写的方法,否则也会产生意想不到的变化。

还是上面的例子,这次我们添加了clone方法到Person类:

    public Object clone() throws CloneNotSupportedException {Person person= (Person)super.clone();person.printValue();return person;}

接下来我们添加clone方法到Boy类:

    public Object clone() throws CloneNotSupportedException {Boy clone = (Boy) super.clone();clone.printValue();return clone;}

因为在clone方法中调用了可重写的方法,从而让系统逻辑变得混乱。不推荐这样使用。

重写equals()方法

考虑一下父类和子类的情况,如果在父类中我们定义了一个equals方法,这个方法是根据父类中的字段来进行比较判断,最终决定两个对象是否相等。

如果子类添加了一些新的字段,如果不重写equals方法,而是使用父类的equals方法,那么就会遗漏子类中新添加的字段,最终导致equals返回意想不到的结果。

所以一般来说,子类需要重写equals方法。

如果重新equals方法,需要满足下面几个特性:

  1. reflexive反射性

对于一个Object a来说,a.equals(a)必须成立。

  1. symmetric对称性

对于一个Object a和Object b来说,如果a.equals(b)==true,那么b.equals(a)==true一定成立。

  1. transitive传递性

对于Object a,b,c来说,如果a.equals(b)==true,b.equals(c)==true,那么a.equals(c)==true一定成立。

  1. consistent一致性

对于Object a,b来说,如果a和b没有发生任何变化,那么a.equals(b)的结果也不能变。

  1. 对于非空的引用a,a.equals(null) 一定要等于false

具体代码的例子,这里就不写了,大家可以自行练习一下。

hashCode和equals

hashCode是Object中定义的一个native方法:

    @HotSpotIntrinsicCandidatepublic native int hashCode();

根据Oracle的建议,如果两个对象的equals方法返回的结果是true,那么这两个对象的hashCode一定要返回同样的int值。

为什么呢?

我们看下下面的一个例子:

public class Girl {private final int age;public Girl(int age) {this.age = age;}@Overridepublic boolean equals(Object o) {if (o == this) {return true;}if (!(o instanceof Girl)) {return false;}Girl cc = (Girl)o;return cc.age == age;}public static void main(String[] args) {HashMap<Girl,Integer> hashMap= new HashMap<>();hashMap.put(new Girl(20), 20);System.out.println(hashMap.get(new Girl(20)));}
}

上面的Girl中,我们定义了equals方法,但是并没有重写hashCode,最后返回的结果是null。

因为我们new了两次Girl这个对象,最后导致native方法中两个不同对象的hashCode是不一样的。

我们可以给Girl类中添加一个hashCode方法:

    public int hashCode() {return age;}

这样就可以返回正确的值。

compareTo方法的实现

我们在实现可比较类的时候,通常需要实现Comparable接口。Comparable接口定义了一个compareTo方法,用来进行两个对象的比较。

我们在实现compareTo方法的时候,要注意保证比较的通用规则,也就是说,如果x.compareTo(y) > 0 && y.compareTo(z) > 0 那么表示 x.compareTo(z) > 0.

所以,我们不能使用compareTo来实现特殊的逻辑。

最近看了一个日本的电影,叫做dubo默示录,里面有一集就是石头,剪刀,布来判断输赢。

当然,石头,剪刀,布不满足我们的通用compareTo方法,所以不能将逻辑定义在compareTo方法中。

 

原文链接
本文为阿里云原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/514940.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ios 蓝牙命令发送_实战恢复cisco 2950交换机的IOS

本来想用两台思科交换机做实验的&#xff0c;可是通过console口进入其中一台交换机后却发现这个台交换机的IOS文件丢失了。本来正常进入交换机后应该是首先进入到用户模式的&#xff0c;而且提示符应该是“>”&#xff0c;而现在提示符却成了“&#xff1a;”&#xff0c;如…

还在担心无代码是否威胁程序员饭碗?

作者 | 伍杏玲头图 | 下载于ICphoto出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;近几年来&#xff0c;“低代码/无代码”概念广为热议。然而低代码并不是新鲜词&#xff0c;实则是IT 界对简化代码开发的需求促使。早在 1982 年&#xff0c;詹姆斯马丁在《…

过Serverless技术降低微服务应用资源成本

前言 在大型分布式IT架构领域&#xff0c;微服务是一项必不可少的技术。从本质上来讲&#xff0c;微服务是一种架构风格&#xff0c;将一个大型的系统拆分为多个拥有独立生命周期的应用&#xff0c;应用之间采用轻量级的通信机制进行通信。这些应用都是围绕具体业务进行构建&a…

ethercat 网卡不兼容_曾经的洋垃圾万兆网卡无人问津因为一张转接卡如今身价暴涨数十倍...

今天老水要跟大家介绍的是最近非常火爆的ocp万兆网卡&#xff0c;为啥非常火爆呢&#xff1f;因为他的价格非常的低廉&#xff0c;性能非常的强劲&#xff0c;最开始的时候售价只要8块钱一张&#xff0c;但是却无人问津&#xff0c;这又是为啥&#xff1f;ocp网卡视频&#xff…

在淘宝,我们是这样衡量代码质量的

简介&#xff1a; ![img](https://img.alicdn.com/tfs/TB1ZTW4VEY1gK0jSZFMXXaWcVXa-2304-1194.png) **越高级别的程序员往往越看重代码质量。** 本篇文章主要聊一下在团队开发过程中&#xff0c;如何做到代码质量的管控与提升。首先需要有一套规范&#xff0c;定义什么是好的代…

SpringBoot项目在logback.xml中读取application.properties中配置的日志路径

文章目录一、问题二、原因三、LOGBACK.XML中读取配置中的日志路径方案3.1. 方案一3.2. 方案二一、问题 在SpringBoot项目&#xff0c;使用logback.xml中配置日志的存储位置时&#xff0c;读取application.properties或application.yml中配置的路径&#xff0c;在logback.xml中…

Java知识全面总结:并发编程+JVM+设计模式+常用框架+....

本文整理的Java知识体系主要包括基础知识&#xff0c;工具&#xff0c;并发编程&#xff0c;数据结构与算法&#xff0c;数据库&#xff0c;JVM&#xff0c;架构设计&#xff0c;应用框架&#xff0c;中间件&#xff0c;微服务架构&#xff0c;分布式架构等内容。同时也有作为程…

智能消息服务-数字短信使用FAQ简介: 数字短信是基于普通短信,通过一套编码技术实现的短信服务。它能把视频、音频、网页、GIF图、文字等多种表现形式通过多媒体短信形式触达用户。本文将带你了解阿里云通信

简介&#xff1a; 数字短信是基于普通短信&#xff0c;通过一套编码技术实现的短信服务。它能把视频、音频、网页、GIF图、文字等多种表现形式通过多媒体短信形式触达用户。本文将带你了解阿里云通信数字短信产品的开通与使用。 一、数字短信功能如何开通&#xff1f; 1.开通…

xxl-job registry fail, registryParam:RegistryParam{regist

在项目集成xxl-job发现执行器一直注册不上去&#xff0c;心跳报错。 xxl-job registry fail, registryParam:RegistryParam{registryGroup‘EXECUTOR’, registryKey‘xxl-job-invoice-api’, registryValue‘http://xxxxxx:9990/’}, registryResult:ReturnT [code500, msgTh…

台达b3伺服参数设置方法_2020东莞清溪台达自动化配件回收厂家直购

2020东莞清溪台达自动化配件回收厂家直购在不同的工业控制系统中&#xff0c;工控软件虽然完成的功能不同&#xff0c;但就其结构来说&#xff0c;一般具有如下特点&#xff1a;实时性&#xff1a;工业控制系统中有些事件的发生具有随机性&#xff0c;要求工控软件能够及时地处…

3千字带你搞懂XXL-JOB任务调度平台

思维导图 文章已收录Github精选&#xff0c;欢迎Star&#xff1a;https://github.com/yehongzhi/learningSummary 一、概述 在平时的业务场景中&#xff0c;经常有一些场景需要使用定时任务&#xff0c;比如&#xff1a; 时间驱动的场景&#xff1a;某个时间点发送优惠券&…

“今朝安全众测平台”正式启动运行

2021年5月19日&#xff0c;由中国信息产业商会指导&#xff0c;中国信息安全测评中心组织运营的“今朝安全众测平台”正式启动运行&#xff0c;提供网络安全众测服务。 “今朝安全众测平台”启动运行发布会在北京国谊宾馆成功召开。发布会以“群贤毕至谋众测&#xff0c;志存高…

自然语言处理在开放搜索中的应用

自然语言智能&#xff08;NLP&#xff09; 自然语言智能研究实现人与计算机之间用语言进行有效通信。它是融合语言学、心理学、计算机科学、数学、统计学于一体的科学。它涉及到自然语言和形式化语言的分析、抽取、理解、转换和产生等多个课题。 人工智能可以分为几个阶段 •…

XXL-JOB使用 2.3.1

启动脚本 #!/bin/bash# jar path APP_NAME/apps/xxl-job/xxl-job-admin-2.3.1-SNAPSHOT.jar#log path LOG_NAME/apps/logs/xxl-job/xxl-job-admin.log#kill process pidps -ef|grep $APP_NAME | grep -v grep | awk {print $2} kill -9 $pidecho "$pid kill success"…

搞定客户端证书错误,看这篇就够了

简介&#xff1a; TLS/SSL 握手失败引起的连接异常问题怎么搞&#xff1f;阿里云 SRE 工程师手把手带你排查解决。 1.TLS/SSL 握手基本流程 *图片来源于网络 2.案例分享 2.1CFCA 证书的历史问题 2.1.1背景 某客户为其生产环境的站点申请了一张由 CFCA 签发的证书。相关域名…

程序员通过脚本免费领到 CSDN 会员卡

很多人喜欢下载插件去丰富浏览器现有功能各式各样的脚本虽有趣但若是能亲手设计开发一个脚本看着大家玩着自己的脚本是不是会觉得更加有成就感呢&#xff1f;想拥有一款属于自己的脚本吗&#xff1f;想获得丰厚的奖品吗&#xff1f;那么就千万不要错过这次活动【2021CSDN脚本征…

12123两小时没付款怎么办_机械厂上班的男朋友,一天十小时,周末不休,没时间陪我怎么办?...

01小江是去年认识的男朋友&#xff0c;当时觉得男朋友老实&#xff0c;在机械厂上班&#xff0c;能吃苦能挣到钱&#xff0c;以后能养家糊口&#xff0c;老老实实过一份踏实的日子。理想很丰满&#xff0c;现实很骨感。他们认识的时候正好是夏天&#xff0c;天气热。男朋友的工…

秒懂云通信:短信也能玩出新花样?听阿里云产品运营畅聊“智能消息”服务

**简介&#xff1a;** 为了帮助用户更好地了解和使用云通信的产品&#xff0c;秒懂云通信系列直播开课啦&#xff01;第二期的首节课程中&#xff0c;阿里云产品运营胡超分享了《畅聊阿里云通信智能消息服务》议题&#xff0c;手把手教你玩转阿里云通信短信服务的创新业务&…

小红书推荐大数据在阿里云上的实践

简介&#xff1a; 本篇内容主要分三个部分&#xff0c;在第一部分讲一下实时计算在推荐业务中的使用场景。第二部分讲一下小红书是怎么使用Flink的一些新的功能。第三部分主要是讲一些OLAP的实时分析的场景&#xff0c;以及和阿里云MC-Hologres的合作。 作者&#xff1a;小红书…

AI 3D 传感器市场竞争白热化,中国掌握自主可控核心技术时不我待!

受访者 | 孔博记者 | 夕颜图源 | 视觉中国出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;提到AI 3D传感技术&#xff0c;也许很少有人脑中有概念。但是以下图iPhone手机最早推出的3D虚拟表情生成为例&#xff0c;大概就会知道这项技术可以用来做什么了。 2017年苹果…