当前位置: 首页 > news >正文

[改善Java代码]让工具类不可实例化

建议42: 让工具类不可实例化

Java项目中使用的工具类非常多,比如JDK自己的工具类java.lang.Math、java.util.Collections等都是我们经常用到的。工具类的方法和属性都是静态的,不需要生成实例即可访问,而且JDK也做了很好的处理,由于不希望被初始化,于是就设置构造函数为private访问权限,表示除了类本身外,谁都不能产生一个实例,我们来看一下java.lang.Math代码:

1 public final class Math {  
2    /**  
3     * Don't let anyone instantiate this class.  
4     */  
5    private Math() {}  
6 } 

之所以要将“Don抰 let anyone instantiate this class.”留下来,是因为Math的构造函数设置为private了:我就是一个工具类,我只想要其他类通过类名来访问,我不想你通过实例对象访问。这在平台型或框架型项目中已经足够了。但是如果已经告诉你不能这么做了,你还要生成一个Math实例来访问静态方法和属性(Java的反射是如此的发达,修改个构造函数的访问权限易如反掌),那我就不保证正确性了,隐藏问题随时都有可能爆发!那我们在项目开发中有没有更好的限制办法呢?有,即不仅仅设置成private访问权限,还抛异常,代码如下:

1 public class UtilsClass {  
2      private UtilsClass(){  
3         throw new Error("不要实例化我!");  
4      }  
5 } 

如此做才能保证一个工具类不会实例化,并且保证所有的访问都是通过类名来进行的。需要注意一点的是,此工具类最好不要做继承的打算,因为如果子类可以实例化的话,那就要调用父类的构造函数,可是父类没有可以被访问的构造函数,于是问题就会出现。

注意 如果一个类不允许实例化,就要保证“平常”渠道都不能实例化它。

 

转载于:https://www.cnblogs.com/DreamDrive/p/5430316.html

相关文章:

  • Sentinel快速入门:这可能是目前最好的分布式系统限流降级框架
  • [CareerCup] 17.8 Contiguous Sequence with Largest Sum 连续子序列之和最大
  • 想在一个项目中实现多数据源切换?几行代码就搞定了
  • 分享工作一年后收藏的超好用Idea插件,工作效率直接翻倍
  • Activity后台运行一段时间回来crash问题的分析与解决
  • SpringBoot+SpringSecurity实现基于真实数据的授权认证
  • Linux SendMail发送邮件失败诊断案例(三)
  • ElasticSearch究竟是个什么东西
  • 菜鸟学自动化测试(五)-----selenium命令之定位页面元素
  • 软件行业和互联网行业究竟有什么区别?又该如何去选择?
  • 今天打开阿里妈妈惊现 ¥50 元佣金
  • 通过官方文档高效学习ElasticSearch的JavaAPI实现!
  • 如何在自己的项目中引入ElasticSearch搜索引擎?
  • JSON--百度百科
  • 一个双非本科程序员工作一年的经历
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • GraphQL学习过程应该是这样的
  • input的行数自动增减
  • iOS小技巧之UIImagePickerController实现头像选择
  • Java应用性能调优
  • PermissionScope Swift4 兼容问题
  • Web设计流程优化:网页效果图设计新思路
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 测试如何在敏捷团队中工作?
  • 深度学习在携程攻略社区的应用
  • 思考 CSS 架构
  • 异常机制详解
  • Hibernate主键生成策略及选择
  • k8s使用glusterfs实现动态持久化存储
  • ​比特币大跌的 2 个原因
  • ​如何在iOS手机上查看应用日志
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #define 用法
  • #Linux(Source Insight安装及工程建立)
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • #数学建模# 线性规划问题的Matlab求解
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (排序详解之 堆排序)
  • (四)Android布局类型(线性布局LinearLayout)
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (转) 深度模型优化性能 调参
  • .htaccess配置重写url引擎
  • .Net Core和.Net Standard直观理解
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径