java 项目中使用的工具类非常多,比如JDK自己的工具java.lang.Math 、java.util.Collections 等都是我们经常用到的工具类。工具类的属性和方法都是静态的,不需要生成实例即可访问,而且JDK也做了很好的处理,由于不希望被初始化,于是设置了构造函数为private的权限,表示除了此类本身外,谁都不能产生一个实例。
看一下java.lang.Math的部分代码:
public final class Math {
/** * Don't let anyone instantiate this class. */ private Math() {}
/** * The <code>double</code> value that is closer than any other to * <i>e</i>, the base of the natural logarithms. */ public static final double E = 2.7182818284590452354;
/** * The <code>double</code> value that is closer than any other to * <i>pi</i>, the ratio of the circumference of a circle to its * diameter. */ public static final double PI = 3.14159265358979323846;
…… …… …… …… …… …… …… ……
Math的构造函数设置成了private了:我就是一个工具类,我只想其它类通过类名打点来访问,我不想通实例对象访问。这在平台型和框架型项目中已经足够了。但是已经告诉你不能这么做了,你还是要实例Math类来访问属性和静态方法(java反射是如此的发达,修改一个构造函数的访问权限易如反掌),这样就确保不了正确性了,隐藏的问题随时都可能爆发!那我们在项目开发中有没有更好的限制办法呢?有,不仅仅设置成private访问权限,还要抛异常,代码实例如下:
public class LdapUtils {
private LdapUtils() {throw new Error("请不要实例化我!");}}
这样做才能确保工具类才能不会被实例化,并且保证所有访问都是通过类名来进行的。需要注意的是,此工具类不能做继承的打算,因为如果子类可以实例化的话,那就要调用父类的构造函数,可以父类没有被访问的构造函数,于是问题自然而然就出现了。
注意:如果一个类不允许实例化,就要保证“平常”渠道都不能被实例化它。
相关文章
- 【开发随记】JAVA+POI+自定义注解+反射构建自定义工具类实现快捷简便的Excel模板化导出(附demo代码)
- JAVA基础-子类继承父类实例化对象过程
- Java实例化类的几种方法
- Java中类变量和实例变量的初始化
- 深入理解Java对象的创建过程:类的初始化与实例化
- Java类变量、实例变量的初始化顺序
- Winform主菜单两种实现方式-1.)从工具箱中双击MenuStrip控件,窗体的顶部就会放置一个MenuStrip控件,或者在工具箱中单击MenuStrip控件,拖至窗体中也可以. 2.)在MenuStrip的“Type Here”输入主菜单和菜单名字,热键用(&X)表示. 用快捷键选择主菜单,可以用Alt + 预定义的按键来实现,子菜单的选择只需要按定义的热键即可. 3.)双击File*菜单下面的子菜单,创建子菜单Open、Save、Exit的单击事件代码: private void OpenOToolStripMenuItem_Click(object sender, EventArgs e) { OpenFileDialog ofd = new OpenFileDialog { //初始化打开对话框的路径 InitialDirectory = @"D:\", Title = "Open File", //定义可显示的文件类型; Filter = "txt file(*.txt)|*.txt|All file(*.*)|*.*", //定义默认显示的文件类型为txt FilterIndex = 1, //对话框关闭后将复位初始化路径 RestoreDirectory = true }; if (ofd.ShowDialog == DialogResult.OK) { //根据打开对话框选择的文件名,加载文本内容到富文本框中. richtxtContent.Text = File.ReadAllText(ofd.FileName); } } private void SaveSToolStripMenuItem_Click(object sender, EventArgs e) { SaveFileDialog sfd = new SaveFileDialog { //初始化保存对话框的路径 InitialDirectory = @"D:\", Title = "Save File", //定义可显示的文件类型; Filter = "txt file(*.txt)|*.txt|All file(*.*)|*.*", //定义默认显示的文件类型为txt FilterIndex = 1, //对话框关闭后将复位初始化路径 RestoreDirectory = true }; if(sfd.ShowDialog == DialogResult.OK) { //保存文件 File.WriteAllText(sfd.FileName, richtxtContent.Text); //清空富文本框内容 richtxtContent.Clear; } } private void exitEToolStripMenuItem_Click(object sender, EventArgs e) { Application.Exit; } 4.)执行下程序,加载指定的txt文件到富文本框中,如下: 5.)在富文本框中更新加载进来的txt文件内容. 6.)Alt + F热键打开文件的下拉菜单,单击S保存富文本框中的内容到指定的文件.打开txt验证菜单单击事件保存文件成功. 二.实现winform主菜单的方法2:MenuStrip类和toolStripMenuItem类实例化对象,在主窗体加载事件中实现如下代码:
- 深入分析Java反射(五)-类实例化和类加载
- java将文件打包成ZIP压缩文件的工具类实例
- 获取Spring容器中Bean实例的工具类(Java泛型方法实现)