前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java类如何防止被实例化

Java类如何防止被实例化

作者头像
夹胡碰
发布2020-08-14 16:24:44
1.7K0
发布2020-08-14 16:24:44
举报
文章被收录于专栏:程序猿~程序猿~
有一些类不想被实例化, 比如静态方法的工具类, 这时要对类进行特殊处理
其中有两点需要注意:
  • 防止通过new实例化 - 解决办法:使用 private 修饰符进行限制
  • 防止通过反射实例化 - 解决办法:抛出 Error 进行限制(如果不抛出异常, 只通过private进行限制, 则通过反射依然能被实例化)
代码如下:
代码语言:javascript
复制
// 不可实例化工具类
public final class MyUtils {
    private MyUtils() {
        throw new AssertionError("No " + MyUtils.class.getName() + " instances for you !");
    }
}
实例化测试:
  • new实例化
代码语言:javascript
复制
// 编译报错 - MyUtils() 在 com.jiafupeng.controller.rest.MyUtils 中是 private 访问控制
MyUtils myUtils = new MyUtils();
  • 反射实例化
代码语言:javascript
复制
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
代码语言:javascript
复制
/**
 * 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!");
    }
    ...
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 有一些类不想被实例化, 比如静态方法的工具类, 这时要对类进行特殊处理
  • 其中有两点需要注意:
  • 代码如下:
  • 实例化测试:
  • 拓展 可参考 java.util.Objects
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档