`
ribishuangba
  • 浏览: 296262 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

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关键字来表示类不允许被继承。

分享到:
评论

相关推荐

    Android Crash Helper。安卓APP自定义异常处理器.zip

    软件开发设计:PHP、QT、应用软件开发、系统软件开发、移动应用开发、网站开发C++、Java、python、web、C#等语言的项目开发与学习资料 硬件与设备:单片机、EDA、proteus、RTOS、包括计算机硬件、服务器、网络设备、...

    javatools源码-codelib-gen:此python工具从CodeLib的java源代码生成C++类

    实际上,它会扫描提供的CodeLib的类,方法和字段签名,并生成一个C ++类,将其公开给ARTist框架。 有关ARTist框架和生态系统的更多信息,请查看下面的专用部分。 用法 $ ./codelib-gen.py -h CodeLibGen (1.0.0 RC2)...

    javacv-platform-1.3.3-src

    JavaCV also comes with helper classes and methods on top of OpenCV and FFmpeg to facilitate their integration to the Java platform. Here is a small demo program demonstrating the most frequently ...

    用于加速机器学习和深度学习应用程序的 Java 库

    The JavaCPP Presets modules contain Java configuration and interface classes for widely used C/C++ libraries. The configuration files in the org.bytedeco.<moduleName>.presets packages are used by the ...

    Android Crash Helper 安卓APP自定义异常处理器.zip

    包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】...

    [文件数据]站长助手(WEBMASTER HELPER) v2.0_wh_v2.0.rar

    包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用...

    文件数据站长助手(WEBMASTER HELPER) v2.0-wh-v2.0.rar

    包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用...

    Visual.C#.编程精彩百例

    实例72 在.NET程序设计中使用ATL 实例73 浏览Internet文件 实例74 在C#应用程序中打开浏览器 实例75 显示Internet文件信息 实例76 Puzzle游戏 实例77 MDI窗体菜单设计(1) 实例78 MDI窗体菜单设计(2) 实例...

    jni_helper:在APK中查找JNI函数签名并应用于反向工具

    在APK中找到JNI函数签名,并将其应用于反向工具。 基本用法 使用生成signature.json 将signature.json加载到Ghidra / IDA / Radare2中 JadxFindJNI.jar 建造: $ make jni 或者,您可以只下载。 用法: $ java -...

    vc 6.0开发ftp断点续传源代码

    在自己的工程中引入所有文件,在stdafx.h中对照本下载工具项目的stdafx.h,应该是要加入afxsock.h。 参考main.cpp。主要是调用DownloadHelper。先添加任务,然后设置onFinish(下载完成后的动作),最后start。 如果...

    simple-database3-helper:带有 SQLiteOpenHelper 的简单 CRUD 示例

    simple-database3-helper 带有 SQLiteOpenHelper 的简单 CRUD 示例

    《Visual.C#.编程精彩百例》配套光盘part1

    实例96 C#与C++混合编程的应用 实例97 C#与VB混合编程的应用 实例98 C#组件与C#客户程序编程的应用 实例99 C#与XML联合应用XMLHelper 实例100 在C#中部署应用程序 附录 WinCV 参考文献

    《Visual.C#.编程精彩百例》配套光盘.part2

    实例90 在“新建”中添加自己的文件类型 实例91 显示Exchange软件的客户名称 实例92 读取Windows注册表信息 实例93 自定义AboutBox组件 实例94 自定义控件及应用 实例95 Java与C#混合编程的...

    asp.net知识库

    在Asp.net中如何用SQLDMO来获取SQL Server中的对象信息 使用Relations建立表之间的关系并却使用PagedDataSource类对DataList进行分页 通过作业,定时同步两个数据库 SQLSERVER高级注入技巧 利用反射实现ASP.NET控件和...

    Notepad++ 绿色版+多个实用插件

    Notepad++ 是一款非常有特色的编辑器,是开源软件,可以免费使用。 功能有: ①、内置支持多达 27 种语法高亮度显示(囊括各种常见的源代码、...RegEx Helper,在文档的中匹配正则表达式,可以用来测试正则表达式。

    matlab虚线图代码-callGraph:一种多语言工具,用于解析函数定义和调用的源代码

    c/c++/java,因为它们复杂多样的语法需要繁重的机器。 Usage: callGraph If your script calls helper modules, and you want the call graph to display the modules' functions, list the modules explicitly on...

    gvim常用插件及其配置文件配置(下载解压即可使用)

    c-c++-keywords.list c-c++-keywords.list.bak k+r.list stl_index.list .vim/CVIMSYN: engspchk.contraction engspchk.dialect engspchk.dict engspchk.match engspchk.proper engspchk.rare .vim/doc: acp.jax ...

Global site tag (gtag.js) - Google Analytics