Helper类在Java和C++中的设计

来源:java认证发布时间:2012-11-12 13:16:13java认证视频

  由于私有构造函数,因此不可以被直接创建对象,也不可以被子类继承后,然后创建子类对象。如果必要的话,还可在私有构造函数中抛出异常,以防止reflection的攻击。

  Java有三个选择

  1)采用普通的类

  有公有构造函数,没有成员变量,提供了很多成员函数作为方法,调用代码如下:

  Helper helper = new Helper();

  helper.f1();

  这种方法的缺点是创建对象的开销是不必要的,我们知道创建对象意味着,首先要分配内存,然后在该内存上创建对象。在一个大量创建helper对象的场景中,这种负担是很大的。

  2)为了避免这种反复创建对象的开销,可以采用Singleton延迟创建技术,确保整个进程中只有一个对象,并且只有第一次调用的时候才会被创建出来。

  Helper helper = Helper.getInstance();

  helper.f1();

  这个方法进步很多了,但是仍然有缺点。这会导致系统中有很多Singleton类。其实Singleton主要用在表达系统中唯一存在的对象,通常这些对象都是有状态的。一个系统设计中过多的为了其他目的而设计的Singleton会让开发者觉得困惑。因此,如果一个类没有成员变量,应该优先设计成Helper类,而不是Singleton.

  3)普通的类,提供静态方法访问,构造函数为私有。同时用final关键字修饰class表示不允许被继承。

  Helper.f1();

  由于私有构造函数,因此不可以被直接创建对象,也不可以被子类继承后,然后创建子类对象。如果必要的话,还可在私有构造函数中抛出异常,以防止reflection的攻击。

  我认为这是Java中最好的方案。

  下面是我的JDBC方面的一个Helper类代码:

  以下是代码片段:import java.sql.Statement;import java.sql.ResultSet;import java.sql.SQLException;import org.slf4j.Logger;public final class CloseHelper { private CloseHelper(){ throw new UnsupportedOperationException("CloseHelper is a helper class,can't be initated");} public static void close(ResultSet set , Logger log){ if(set!=null){ try{ set.close();}catch(SQLException ex){ log.error(ex.getMessage(),ex);} public static void close(Statement statement , Logger log){ if(statement!=null){ try{ statement.close();}catch(SQLException ex){ log.error(ex.getMessage(),ex);} C++

  同样的推理,同样的结论。但是C++中缺少代码检查工具,如果忘记将构造函数变成私有,Java的检查工具通常会提醒。C++只能靠制定编码规范来解决。而且C++中也没有final关键字来表示类不允许被继承。

  考试大温馨提示:本内容来源于网络,仅代表作者个人观点,与本站立场无关,仅供您学习交流使用。其中可能有部分文章经过多次转载而造成文章内容缺失、错误或文章作者不详等问题,请您谅解。如有侵犯您的权利,请联系我们,本站会立即予以处理。

视频学习

我考网版权与免责声明

① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;

② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。

最近更新

社区交流

考试问答