Java编程语言的人气自然无需质疑,从Web应用到Android应用,这款语言已经被广泛用于开发各类应用及代码中的复杂功能。

不过在编写代码时,bug永远是困扰每一位从业者的头号难题。在今天的文章中,我们将分享五贡最佳实践,希望帮助大家更为轻松地减少Java开发中的bug数量。

原则一:不要依赖初始化

在Java中,开发者常常依赖构造函数进行对象初始化。不过这其实是一种常见误区。我们完全可以在无需调用构造函数的情况下,通过多种方式实现对象分配。

下面来看几种常用方式:

• 大家可以将所有变量声明为私有。要访问该类外的对象,大家可使用GET与SET方法。

• 对每个对象,编写一个新的私有boolean变量并对其进行初始化。

• 编写一个非构造函数类,其将确保每个对象会在接受调用之前进行初始化。

原则二:保护类、方法与变量

在代码当中,类、方法与变量分为私有与公共两类。私有类无法轻松进行访问,这使其成为代码中的高安全性点。不过公共方法与变量则易于方法,也因此常常成为攻击突破口。因此,请尽可能限制其范围。

请记住,只在必要时开放类、方法与变量。

原则三:永远对范围进行预定义

大多数开发者完全依赖于软件包自身的范围设定,事实上我们应当坚持对代码范围进行预定义。很多类本身并非完全封闭,这意味着攻击者能够对其施以攻击。黑客可以利用单一漏洞插入自己的类,进而从代码中提取敏感信息。JVM在默认情况下即不会封闭,不过允许大家在该软件包内进行类封闭。

原则四:避免使用内部类

一般来讲,开发者会在同一软件包内其它类需要时使用内部类。这些内部类通常可供同一软件包内全部类进行访问,由此可能引发的问题在预定义代码范围部分已经提到。因此,同样请仅在必要时使用内部类。

原则五:确保类不可克隆

Java提供一项功能,用于在需要时对自有类进行克隆。然而这项功能往往被黑客所利用,其能够使用java.lang.Cloneable从代码中复制代码实例并窃取必要信息。

要解决这个问题,大家只需要在代码中的每个类中添加以下代码。

  1. public final void clone()throws 
  2.  
  3. java.lang.CloneNotSupportedException { 
  4.  
  5.     thrownewjava.lang.CloneNotSupportedException(); 
  6.  
  7. } 

如果大家希望自己的class具备可克隆性,同时仍然尽可能避免安全问题,那么则可自行定义克隆方法,并将其设置为final。

如果大家在自己的某个超类中使用了nonfinal克隆方法,则请按以下方式定义该方法:

  1. public final void clone() 
  2.  
  3. throwsjava.lang.CloneNotSupportedException { 
  4.  
  5.     super.clone(); } 

当然,没人能100%掌握Java的全部奥秘,但关注上述编程原则及实践,能够帮助大家更为有效地降低代码内bug数量。

Java基础学习总结(81)——如何尽可能的减少Java代码中bug的更多相关文章

  1. Java基础学习总结(44)——10个Java 8 Lambda表达式经典示例

    Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表达式,它将允许我们将行为传到函数里.在Ja ...

  2. Java基础学习总结(59)——30 个java编程技巧

    1.return 一个空的集合,而不是 null 如果一个程序返回一个没有任何值的集合,请确保一个空集合返回,而不是空元素.这样你就不用去写一大堆 "if else" 判断null ...

  3. Java基础学习总结(29)——浅谈Java中的Set、List、Map的区别

    就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...

  4. Java基础学习总结(87)——坚持写Java等技术类博客的好处

    1.加深对技术点的理解 每天写博客,可以加深对技术点的理解,假如工作中,对某个技术点运用的不熟,当你通过博客的形式写出来,这个过程中,遇到不懂的知识点,你就会查阅相关的资料,弄明白他. 2.自己日后用 ...

  5. Java基础学习总结(71)——深入理解Java虚拟机内存

    Java虚拟机中的内存分配图 : 各个区域的特性总结如下表: 补充说明: 当多线程情形下,可能多个线程要在堆上分配内存,那么可能出现内存分配的同步问题,解决方案有两个,一个就是同步内存分配动作:另一个 ...

  6. JAVA基础学习——1.2 环境搭建 之eclipse安装及中文化

    安装好jdk,配置好环境变量以后,下面就可以进行安装eclipse了. 闲话少说,eclipse下载地址:http://www.eclipse.org/downloads/ 不大用关注checksum ...

  7. Java基础学习笔记总结

    Java基础学习笔记一 Java介绍 Java基础学习笔记二 Java基础语法之变量.数据类型 Java基础学习笔记三 Java基础语法之流程控制语句.循环 Java基础学习笔记四 Java基础语法之 ...

  8. 尚学堂JAVA基础学习笔记

    目录 尚学堂JAVA基础学习笔记 写在前面 第1章 JAVA入门 第2章 数据类型和运算符 第3章 控制语句 第4章 Java面向对象基础 1. 面向对象基础 2. 面向对象的内存分析 3. 构造方法 ...

  9. [转帖]java基础学习总结——多态(动态绑定)

    https://www.cnblogs.com/xdp-gacl/p/3644035.html 多态的概念 java基础学习总结——多态(动态绑定) 一.面向对象最核心的机制——动态绑定,也叫多态

  10. java基础学习笔记五(抽象类)

    java基础学习总结——抽象类 抽象类介绍

随机推荐

  1. 在数据库中生成txt文件到网络驱动器中(计算机直接创建的网络驱动器在sql server中没有被找到)

    环境:sql server 2008 一.创建网络驱动器映射 语法:exec master..xp_cmdshell 'net use Z: \\ip地址\网络路径 密码 /user:用户名' 例如: ...

  2. 洛谷 P3121 [USACO15FEB]审查(黄金)Censoring (Gold) 【AC自动机+栈】

    这个和bzoj同名题不一样,有多个匹配串 但是思路是一样的,写个AC自动机,同样是开两个栈,一个存字符,一个存当前点在trie树上的位置,然后如果到了某个匹配串的末尾,则弹栈 #include< ...

  3. python实现对excel数据进行修改/添加

    import osimport xlrdfrom xlutils.copy import copydef base_dir(filename=None): return os.path.join(os ...

  4. 乐搏讲自动化测试- Python自动化测试前景怎么样(4)

    Python言语还能够写爬虫,但仅仅只是爬虫的入门罢了.通过Python入门爬虫比较简略易学,不需要在一开始把握太多太根底太底层的常识就能够很快上手,而且很快能够做出成果,十分合适小白一开始想做出点看 ...

  5. 反向代理与Real-IP和X-Forwarded-For(转)

    如下图所示,客户端通过Nginx Proxy1 和 Nginx Proxy2 两层反向代理才访问到具体服务Nginx Backend(或如Tomcat服务).那Nginx Backend如何才能拿到真 ...

  6. 最新的 xp sp3序列号(绝对可通过正版验证)-xp序列号

    windows xp激活方法一:使用windows xp激活码 以下xp系统激活码都是可用的 MRX3F-47B9T-2487J-KWKMF-RPWBY(工行版) 可用(强推此号) QC986-27D ...

  7. 人人都能读懂的css3 3d小demo

    css3 3d案例总结 最近入坑 Web 动画,所以把自己的学习过程记录一下分享给大家.就把最近做的比较好的给大家分享下 1.旋转拼图 首先看下效果 代码主要由HTML和CSS3组成,应该说还是比较简 ...

  8. mongo 3.4分片集群系列之四:搭建分片集群--哈希分片 + 安全 + 区域

    这个系列大致想跟大家分享以下篇章: 1.mongo 3.4分片集群系列之一:浅谈分片集群 2.mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3.mongo 3.4分片集群系列之三:搭建 ...

  9. HDU_2476_String painter_(区间dp)

    String painter Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  10. Nuxt.js使用详解

    首先来讲一下服务端渲染 直白的说就是在服务端拿数据进行解析渲染,直接生成html片段返回给前端.具体用法也有很多种比如: 传统的服务端模板引擎渲染整个页面 服务渲染生成htmll代码块, 前端 AJA ...