Java类如何防止被实例化
时间:2022-07-23
本文章向大家介绍Java类如何防止被实例化,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
有一些类不想被实例化, 比如静态方法的工具类, 这时要对类进行特殊处理
其中有两点需要注意:
- 防止通过new实例化 - 解决办法:使用 private 修饰符进行限制
- 防止通过反射实例化 - 解决办法:抛出 Error 进行限制(如果不抛出异常, 只通过private进行限制, 则通过反射依然能被实例化)
代码如下:
// 不可实例化工具类
public final class MyUtils {
private MyUtils() {
throw new AssertionError("No " + MyUtils.class.getName() + " instances for you !");
}
}
实例化测试:
- new实例化
// 编译报错 - MyUtils() 在 com.jiafupeng.controller.rest.MyUtils 中是 private 访问控制
MyUtils myUtils = new MyUtils();
- 反射实例化
Class<MyUtils> adminClass = MyUtils.class;
Constructor<?>[] declaredConstructors = adminClass.getDeclaredConstructors();
Constructor<?> c = declaredConstructors[0];
c.setAccessible(true);// 使其能访问到private构造方法
Object o = c.newInstance();
System.out.println(o);
// 运行报错
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.jiafupeng.controller.rest.UserController.main(UserController.java:59)
Caused by: java.lang.AssertionError: No com.jiafupeng.controller.rest.MyUtils instances for you !
at com.jiafupeng.controller.rest.MyUtils.<init>(MyUtils.java:11)
... 5 more
拓展 可参考 java.util.Objects
/**
* This class consists of {@code static} utility methods for operating
* on objects. These utilities include {@code null}-safe or {@code
* null}-tolerant methods for computing the hash code of an object,
* returning a string for an object, and comparing two objects.
*
* @since 1.7
*/
public final class Objects {
private Objects() {
throw new AssertionError("No java.util.Objects instances for you!");
}
...
}
- [C#2] 2-匿名方法
- jquery 操作css 选择器
- 主页后台源码及释义
- [C#2] 3-局部类型、属性访问器保护级别、命名空间别名限定符
- (2013.09更新)最新W3School 离线完整版CHM 电子书下载
- [C#2] 1-泛型
- .NET4.0的可扩展缓存系统
- 让WordPress 在RSS 中Feed 截断文字输出
- [C#1] 11-接口
- jquery 标签中的属性操作
- 使用MongoDB存储访问者信息
- 解决WordPress 打开Feed页面“This page contains the following errors…”的问题
- jquery表单属性筛选元素
- [C#1] 10-事件
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- RTSP拉流协议视频平台EasyNVR能够接入多少路视频直播流?
- 安装allure后执行命令后报错 INTERNALERROR> AttributeError: module 'pytest' has no attribute 'allure'
- 太好玩了,爬虫、部署API、加小程序,一条龙玩转知乎热榜
- SwiftUI:与 MapKit 协调器通信
- SwiftUI:集成 MapKit
- Seurat教程 || 分析Cell Hashing数据
- 图数据库之TinkerPop Provider
- SwiftUI:用枚举切换视图状
- 【POI】maven引用POI的依赖,XSSFWorkbook依旧无法使用的问题。
- SwiftUI: 将数据写入文档目录
- 如何从YouTube搬运视频?| Mixlab代码入门
- 「MoreThanJava」Day 7:接口详解
- Python 基础(十一):面向对象
- 使用tensorflow进行音乐类型的分类
- Mac安装brew 及安装报错的解决办法【已解决】