梦想飞翔

自强不息
posts - 111, comments - 30, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

2007年4月23日

大数据是用scala语言,和java有些不同又比java强大,省去了很多繁琐的东西,scala中的的接口用trait来定义,不同于java的接口,trait中可以有抽象方法也可以有不抽象方法。scala中的方法中还可以定义方法,这在java中是从来没有的。
大数据未来几年发展的重点方向,大数据战略已经在十八届五中全会上作为重点战略方向,中国在大数据方面才刚刚起步,但是在美国已经产生了上千亿的市场价值。举个例子,美国通用公司是一个生产飞机发动机的一个公司,这家公司在飞机发动机的每一个零部件上都安装了传感器,这些传感器在飞机发动机运作的同时不断的把发动机状态的数据传到通用公司的云平台上,通用公司又有很多数据分析中心专门接受这些数据,根据大数据的分析可以随时掌握每一家航空公司发动机的飞行状况,可以告知这些航空公司发动机的哪些部件需要检修或保养,避免飞机事故,通过这种服务通用公司就产生了几百亿美元的产值。
现在正是学习大数据的最好机遇,不花一分钱就可以成为大数据高手,实现年薪50万的梦想。
王家林的第一个中国梦:免费为全社会培养100万名优秀的大数据从业人员!
您可以通过王家林老师的微信号18610086859发红包捐助大数据、互联网+、O2O、工业4.0、微营销、移动互联网等系列免费实战课程, 目前已经发布的王家林免费视频全集如下:
1,《大数据不眠夜:Spark内核天机解密(共100讲)》:http://pan.baidu.com/s/1eQsHZAq 
2,《Hadoop深入浅出实战经典》http://pan.baidu.com/s/1mgpfRPu 
3,《Spark纯实战公益大讲坛》http://pan.baidu.com/s/1jGpNGwu 
4,《Scala深入浅出实战经典》http://pan.baidu.com/s/1sjDWG25 
5,《Docker公益大讲坛》http://pan.baidu.com/s/1kTpL8UF 
6,《Spark亚太研究院Spark公益大讲堂》http://pan.baidu.com/s/1i30Ewsd 
7,DT大数据梦工厂Spark、Scala、Hadoop的所有视频、PPT和代码在百度云网盘的链接:
http://pan.baidu.com/share/home?uk=4013289088#category/type=0&qq-pf-to=pcqq.group 
王家林免费在51CTO发布的1000集合大数据spark、hadoop、scala、docker视频: 
1,《Scala深入浅出实战初级入门经典视频课程》http://edu.51cto.com/lesson/id-66538.html 
2,《Scala深入浅出实战中级进阶经典视频课程》http://edu.51cto.com/lesson/id-67139.html 
3,《Akka深入浅出实战经典视频课程》http://edu.51cto.com/lesson/id-77672.html 
4,《Spark亚太研究院决胜大数据时代公益大讲堂》http://edu.51cto.com/lesson/id-30815.html 
5,《云计算Docker虚拟化公益大讲坛 》http://edu.51cto.com/lesson/id-61776.html 
6,《Spark 大讲堂(纯实战手动操作)》http://edu.51cto.com/lesson/id-78653.html 
7,《Hadoop深入浅出实战经典视频课程-集群、HDFS、Yarn、MapReduce》http://edu.51cto.com/lesson/id-77141.html 
8,《从技术角度思考Hadoop到底是什么》http://edu.51cto.com/course/course_id-1151.html 

“DT大数据梦工厂”团队第一个中国梦:免费为社会培养100万名优秀的大数据从业人员。每天早上4点起持续分享大数据、互联网+、O2O、工业4.0、微营销、移动互联网等领域的
精华内容,帮助您和公司在DT时代打造智慧大脑,将生产力提高百倍以上!
DT大数据梦工厂微信公众号:DT_Spark,二维码如下,期待大家加入!

posted @ 2015-12-22 11:23 love1563 阅读(93) | 评论 (0)编辑 收藏

大数据是用scala语言,和java有些不同又比java强大,省去了很多繁琐的东西,scala中的的接口用trait来定义,不同于java的接口,trait中可以有抽象方法也可以有不抽象方法。scala中的方法中还可以定义方法,这在java中是从来没有的。
大数据未来几年发展的重点方向,大数据战略已经在十八届五中全会上作为重点战略方向,中国在大数据方面才刚刚起步,但是在美国已经产生了上千亿的市场价值。举个例子,美国通用公司是一个生产飞机发动机的一个公司,这家公司在飞机发动机的每一个零部件上都安装了传感器,这些传感器在飞机发动机运作的同时不断的把发动机状态的数据传到通用公司的云平台上,通用公司又有很多数据分析中心专门接受这些数据,根据大数据的分析可以随时掌握每一家航空公司发动机的飞行状况,可以告知这些航空公司发动机的哪些部件需要检修或保养,避免飞机事故,通过这种服务通用公司就产生了几百亿美元的产值。
现在正是学习大数据的最好机遇,不花一分钱就可以成为大数据高手,实现年薪50万的梦想。
王家林的第一个中国梦:免费为全社会培养100万名优秀的大数据从业人员!
您可以通过王家林老师的微信号18610086859发红包捐助大数据、互联网+、O2O、工业4.0、微营销、移动互联网等系列免费实战课程, 目前已经发布的王家林免费视频全集如下:
1,《大数据不眠夜:Spark内核天机解密(共100讲)》:http://pan.baidu.com/s/1eQsHZAq 
2,《Hadoop深入浅出实战经典》http://pan.baidu.com/s/1mgpfRPu 
3,《Spark纯实战公益大讲坛》http://pan.baidu.com/s/1jGpNGwu 
4,《Scala深入浅出实战经典》http://pan.baidu.com/s/1sjDWG25 
5,《Docker公益大讲坛》http://pan.baidu.com/s/1kTpL8UF 
6,《Spark亚太研究院Spark公益大讲堂》http://pan.baidu.com/s/1i30Ewsd 
7,DT大数据梦工厂Spark、Scala、Hadoop的所有视频、PPT和代码在百度云网盘的链接:
http://pan.baidu.com/share/home?uk=4013289088#category/type=0&qq-pf-to=pcqq.group 
王家林免费在51CTO发布的1000集合大数据spark、hadoop、scala、docker视频: 
1,《Scala深入浅出实战初级入门经典视频课程》http://edu.51cto.com/lesson/id-66538.html 
2,《Scala深入浅出实战中级进阶经典视频课程》http://edu.51cto.com/lesson/id-67139.html 
3,《Akka深入浅出实战经典视频课程》http://edu.51cto.com/lesson/id-77672.html 
4,《Spark亚太研究院决胜大数据时代公益大讲堂》http://edu.51cto.com/lesson/id-30815.html 
5,《云计算Docker虚拟化公益大讲坛 》http://edu.51cto.com/lesson/id-61776.html 
6,《Spark 大讲堂(纯实战手动操作)》http://edu.51cto.com/lesson/id-78653.html 
7,《Hadoop深入浅出实战经典视频课程-集群、HDFS、Yarn、MapReduce》http://edu.51cto.com/lesson/id-77141.html 
8,《从技术角度思考Hadoop到底是什么》http://edu.51cto.com/course/course_id-1151.html 

“DT大数据梦工厂”团队第一个中国梦:免费为社会培养100万名优秀的大数据从业人员。每天早上4点起持续分享大数据、互联网+、O2O、工业4.0、微营销、移动互联网等领域的
精华内容,帮助您和公司在DT时代打造智慧大脑,将生产力提高百倍以上!
DT大数据梦工厂微信公众号:DT_Spark,二维码如下,期待大家加入!

posted @ 2015-12-22 11:22 love1563 阅读(78) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2015-02-27 19:30 love1563 阅读(1395) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2014-02-18 16:45 love1563 阅读(4080) | 评论 (3)编辑 收藏

     摘要:   阅读全文

posted @ 2013-12-28 10:34 love1563 阅读(2300) | 评论 (0)编辑 收藏

     摘要:     JessMA(原名:Portal-Basic)是一套功能完备的高性能 Full-Stack Web 应用开发框架,内置可扩展的 MVC Web 基础架构和 DAO 数据库访问组件(内部已提供了 Hibernate、MyBatis 与 JDBC...  阅读全文

posted @ 2013-11-24 07:49 love1563 阅读(3430) | 评论 (0)编辑 收藏

     摘要: ITPUB索引树  阅读全文

posted @ 2013-09-30 11:42 love1563 阅读(3337) | 评论 (0)编辑 收藏

apache svn:http://svn.apache.org/repos/asf

posted @ 2013-09-03 14:21 love1563 阅读(2212) | 评论 (0)编辑 收藏

开发软件时,我的主要目标之一是:要么防止将缺陷引入代码库,要么限制缺陷的生存期;换言之,要尽早找到缺陷。很显然,越是了解如何编写更好的代码以及如何有效测试软件,就越能及早地捕捉到缺陷。我也很想要一张能发现潜在缺陷的安全之网。

在本系列 八月份 的那期文章中,我得出了这样的结论:将检验工具集成到构建过程(例如,使用 Ant 或 Maven)中,能够建立起一种寻找潜在缺陷的方法。尽管这种方法使一致性成为可能并超越了 IDE,但它也有一点反作用。必须在本地构建软件或等待 Continuous Integration 构建的运行。如果使用 Eclipse 插件,就可以在通过 Continuous Integration 构建或集成 发现一些这样的冲突。这就促成了我称为渐进编程 的编程方式,在这种方式下,允许在编码过程中进行一定程度的质量检验 ——再也不能比这个更早了!

本文涵盖了我所认为的 “五大” 代码分析领域:

  • 编码标准
  • 代码重复
  • 代码覆盖率
  • 依赖项分析
  • 复杂度监控

可以用接下来的几个灵活的 Eclipse 插件来揭示这些分析领域:

  • CheckStyle:用于编码标准
  • PMD 的 CPD:帮助发现代码重复
  • Coverlipse:测量代码覆盖率
  • JDepend:提供依赖项分析
  • Eclipse Metric 插件:有效地查出复杂度

Eclipse 不是您的构建系统

  使用 Eclipse 插件与您将这些检验工具用于构建过程并不矛盾。事实上,您想要确保的是:下列使用 Eclipse 插件的规则就是应用到构建过程中的规则。

安装 Eclipse 插件

安装 Eclipse 插件再简单不过了,只需要几个步骤。在开始之前,最好把该插件下载站点的 URL 准备好。表 1 是本文用到的插件的列表:


表 1. 代码改进插件和相应的下载站点 URL
工具目的Eclipse 插件的 URL
CheckStyle编码标准分析http://eclipse-cs.sourceforge.net/update/
Coverlipse测试代码覆盖率http://coverlipse.sf.net/update
CPD复制/粘贴检验http://pmd.sourceforge.net/eclipse/
JDepend包依赖项分析http://andrei.gmxhome.de/eclipse/
Metrics复杂度监控http://metrics.sourceforge.net/update

知道了这些有用插件的下载地址后,安装插件就是一个极简单的过程。启动 Eclipse,然后遵循下列步骤:

  1. 选择 Help | Software Updates | Find and Install,如图 1 所示:



    图 1. 寻找并安装 Eclipse 插件
    寻找并安装 Eclipse 插件



  2. 选择 Search for new features to install 单选按钮,单击 Next

  3. 单击 New Remote Site,输入要安装的插件名和 URL(参见图 2),单击 OK,然后单击 Finish 来显示 Eclipse 更新管理器。



    图 2. 配置新的远程站点
    配置新的远程站点



  4. 在 Eclipse 更新管理器中,有一个查看插件各方面特性的选项。我通常选择顶级项,如图 3 所示。选择您需要的选项并单击 Finish。Eclipse 现在安装该插件。您需要重启 Eclipse 实例。



    图 3. 安装 Eclipse 插件
    安装 Eclipse 插件

请遵循上述这些步骤来安装其他的 Eclipse 插件;只需改变插件名和相应的下载位置即可。


用 CheckStyle 校正标准

代码库的可维护性直接影响着软件的整个成本。另外,不佳的可维护性还会让开发人员十分头痛(进而导致开发人员的缺乏)—— 代码越容易修改,就越容易添加新的产品特性。像 CheckStyle 这样的工具可以协助寻找那些可影响到可维护性、与编码标准相冲突的地方,比方说,过大的类、太长的方法和未使用的变量等等。

有关 PMD

另一个叫做 PMD 的开源工具提供的功能和 CheckStyle 类似。我偏爱 CheckStyle,但 PMD 也有很多执着的追随者,所以我建议您了解一下这个工具,毕竟它也颇受一些人的青睐。

使用 Eclipse 的 CheckStyle 插件的好处是能够在编码过程中了解到源代码上下文的各种编码冲突,让开发人员更可能在签入该代码前真正处理好这些冲突。您也几乎可以把 CheckStyle 插件视作一个连续的代码复查工具!

安装 CheckStyle 插件并做如下配置(参见图 4):

  1. 选择 Project,然后选择 Eclipse 菜单中的 Properties 菜单项。

  2. 选择 CheckStyle active for this project 复选框,单击 OK



    图 4. 在 Eclipse 中配置 CheckStyle 插件
    在 Eclipse 中配置 CheckStyle 插件

Eclipse 重新构建工作空间,并在 Eclipse 控制台中列示已发现的编码冲突,如图 5 所示:


图 5. Eclipse 中 CheckStyle 的代码冲突列表
Eclipse 中 CheckStyle 的代码冲突列表

使用 CheckStyle 插件在 Eclipse 内嵌入编码标准检验是一种很棒的方法,用这种方法可以在编码时 积极地改进代码,从而在开发周期的早期发现源代码中潜在的缺陷。这么做还有更多的好处,如节省时间、减少失败,也因此会减少项目的成本。没错,这就是一种积极主动的方式!


用 Coverlipse 确认覆盖率

Coverlipse 是一个用于 Cobertura 的 Eclipse 插件,Cobertura 是一个代码覆盖率工具,可以用它来评估具有相应测试的源代码的比率。Cobertura 也提供一个 Ant 任务和 Maven 插件,但用 Cobertura,您可以在编写代码时 评估代码覆盖率。您见过这样的模式吗?

通过选择 Eclipse 菜单项 Run 安装 Coverlipse 插件并将其和 JUnit 关联起来,该操作会显示一系列运行配置选项,例如 JUnit、SWT 应用程序和 Java™ 应用程序。右键单击它并选择 JUnit w/Coverlipse 节点中的 New。在这里,需要确定 JUnit 测试的位置,如图 6 所示:


图 6. 配置 Coverlipse 以获取代码覆盖率
配置 Coverlipse 以获取代码覆盖率

一旦单击了 Run,Eclipse 会运行 Coverlipse 并在源代码(如图 7 所示)中嵌入标记,该标记显示了具有相关 JUnit 测试的代码部分:


图 7. Coverlipse 生成的具有嵌入类标记的报告
Coverlipse 生成的具有嵌入类标记的报告

正如您所见,使用 Coverlipse Eclipse 插件可以更快地确定代码覆盖率。例如,这种实时数据功能有助于在将代码签入 CM 系统 更好地进行测试。这对渐进编程来说意味着什么呢?


用 CPD 捕捉代码重复

Eclipse 的 PMD 插件提供了一项叫做 CPD(或复制粘贴探测器)的功能,用于寻找重复的代码。为在 Eclipse 中使用这项便利的工具,需要安装具有 PMD 的 Eclipse 插件,该插件具有 CPD 功能。

为寻找重复的代码,请用右键单击一个 Eclipse 项目并选择 PMD | Find Suspect Cut and Paste,如图 8 所示:


图 8. 使用 CPD 插件运行复制粘贴检验
使用 PMD/CPD 插件运行复制粘贴检验

一旦运行了 CPD,您的 Eclipse 根目录下就会创建出一个 report 文件夹,其中包含一个叫做 cpd.txt 的文件,文件中列示了所有重复的代码。图 9 中是一个 cpd.txt 文件的例子:


图 9. Eclipse 插件生成的 CPD 文本文件
Eclipse 插件生成的 CPD 文本文件

靠人工来寻找重复的代码是一项挑战,但使用像 CPD 这样的插件却能在编码时轻松地发现重复的代码。


使用 JDepend 进行依赖项检查

JDepend 是个可免费获取的开源工具,它为包依赖项提供面向对象的度量值,以此指明代码库的弹性。换句话说,JDepend 可有效测量一个架构的健壮性(反之,脆弱性)。

除了 Eclipse 插件,JDepend 还提供一个 Ant 任务、Maven 插件和一个 Java 应用程序,用以获取这些度量值。对于相同的信息,它们有着不同的传递机制;但 Eclipse 插件的特别之处和相应优点是:它能以更接近源代码(即,编码时)的方式传递这条信息。

图 10 演示了使用 Eclipse JDepend 插件的方法:通过右键单击源文件夹并选择 Run JDepend Analysis。一定要选择一个含源代码的源文件夹;否则看不到此菜单项。


图 10. 使用 JDepend Analysis 分析代码
使用 JDepend Analysis 分析代码

图 11 显示了运行 JDepend Analysis 时生成的报告。左边显示包,右边显示针对每个包的依赖项度量值。


图 11. Eclipse 项目中的包依赖项
Eclipse 项目中的包依赖项

正如您所见,JDepend 插件提供了有助于不断观察架构可维护性变化的大量信息 —— 这其中最大的好处是您可以在编码时看到这些数据。


用 Metrics 测量复杂度

“五大”代码分析最后的一项是测量复杂度。Eclipse 提供一种叫做 Metrics 的插件,使用该插件可以进行许多有用的代码度量,包括圈复杂度度量,它用于测量方法中惟一路径的数目。

安装 Metrics 插件并重启 Eclipse;然后遵循下列步骤:

  1. 右键单击您的项目并选择 Properties 菜单。在结果窗口中,选择 Enable Metrics plugin 复选框并单击 OK,如图 12 所示:



    图 12. 为项目配置 Metrics
    为项目配置 Metrics



  2. 从 Eclipse 中选择 Window 菜单打开 Metrics 视图,然后选择 Show View | Other...

  3. 选择 Metrics | Metrics View 打开如图 13 中显示的窗口。您需要使用 Java 透视图并重新构建项目,从而显示这些度量值。



    图 13. 打开 Eclipse 中的 Metrics View
    打开 Eclipse 中的 Metrics View



  4. 单击 OK 来显示如图 14 中的窗口。

    在此例中,我正在查看一个单独方法的圈复杂度。真正妙的是您可以双击 Metrics 列表中的方法,该插件会在 Eclipse 编辑器中为此方法打开源代码。这就让修正变得超级简单(如果需要的话)!



    图 14. 查看方法的圈复杂度
    查看方法的圈复杂度

正如我之前提到过的,Eclipse Metrics 插件还提供了许多功能强大的度量值,有助于您在开发软件的过程中改进代码 —— 可见,它是一个渐进编程意义上的插件!


合适的才是最好的

正如您从本文中看到的那样,将“五大”测量方法,即编码标准、代码重复、代码覆盖率、依赖项分析和复杂度监控,用于改进代码质量十分重要。但适合您的才是好的。请记住还有其他许多可用的 Eclipse 插件(比如 PMD 和 FindBugs)能够帮助您在开发周期的早期改进代码质量。不管您想要的工具或偏爱的方法是什么,重要的是:行动起来去积极改进代码质量并让手工代码检验的过程变得更加有效。我估计您使用这些插件一段时间后,就再也离不开它们了。


参考资料

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • 让开发自动化(Paul Duvall,developerWorks):阅读完整的系列。

  • Improving Code Quality with PMD and Eclipse” (Levent Gurses,Jacoozi,2005 年 1 月):这篇文章将 PMD 视为 Eclipse 插件,介绍了使用 PMD 改进代码质量并缩短代码检验过程的方法。

  • 用 Cobertura 测量测试覆盖率” (Elliotte Rusty Harold,developerWorks,2005 年 5 月):Elliotte Rusty Harold 分享了他的经验,即如何使用代码覆盖率的最佳实践来利用 Cobertura。

  • 不要被覆盖报告所迷惑” (Andrew Glover,developerWorks,2006 年 1 月):这篇文章进一步揭示了覆盖率报告中的数字所代表的真正含义,也给出了这些数字所不能代表的含义。

  • Managing Your Dependencies with JDepend” (Glen Wilcox,OnJava,2004 年 1 月):在这篇文章中,Glen Wilcox 介绍了 JDepend,这是一个可以免费获取的工具,它能洞悉软件架构中的许多质量问题。

  • 软件架构的代码质量” (Andrew Glover,developerWorks,2006 年 4 月):Andrew Glover 介绍了如何持续监控以及如何改正能够影响软件架构长期存续性的代码质量问题。

  • 让开发自动化: 持续检查” (Paul Duvall,developerWorks,2006 年 8 月):Paul Duvall 介绍了自动化的检查工具(如 CheckStyle、JavaNCSS 和 CPD )是如何增强开发过程的以及何时应该使用这些工具。

  • Detecting Duplicate Code with PMD's CPD” (Tom Copeland,OnJava,2003 年 3 月):Tom Copeland 介绍了一种叫做 CPD(复制/粘贴检测器)的开源工具,该工具用于寻找重复的 Java 代码。

  • Maintain organizational standards with code audits” (testearly.com):编码标准有利于广大开发人员对代码库达成共识。

  • developerWorks Java 技术专区:数百篇关于 Java 编程各方面的文章。

获得产品和技术

讨论

  • 提高代码质量论坛:developerWorks 的积极贡献者 Andrew Glover 是一名专注于改进代码质量的顾问,他为这个由他主持的论坛带来了很多相当专业的知识。

关于作者

Paul Duvall

Paul Duvall 是 Stelligent Incorporated 的 CTO,该公司利用有效的开发人员测试策略,以及能够让团队尽早尽多地监视和提高代码质量的持续集成技术,帮助其他企业解决软件的质量问题。他还是 UML™ 2 Toolkit 一书的作者之一,目前正在与他人合作撰写 Continuous Integration: Improving Software Quality and Reducing Risk (Addison-Wesley) 一书。

posted @ 2013-06-19 17:27 love1563 阅读(2158) | 评论 (1)编辑 收藏

http://www.open-open.com/bbs/view/1320934157953/


  1. ctrl+shift+r:打开资源

    这可能是所有快捷键组合中最省时间的了。这组快捷键可以让你打开你的工作区中任何一个文件,而你只需要按下文件名或mask名中的前几个字母,比如applic*.xml。美中不足的是这组快捷键并非在所有视图下都能用。


【转】eclipse快捷键 10个最有用的快捷键

2. ctrl+o:快速outline

    如果想要查看当前类的方法或某个特定方法,但又不想把代码拉上拉下,也不想使用查找功能的话,就用ctrl+o吧。它可以列出当前类中的所有方法及属性,你只需输入你想要查询的方法名,点击enter就能够直接跳转至你想去的位置。


【转】eclipse快捷键 10个最有用的快捷键

3. ctrl+e:快速转换编辑器

    这组快捷键将帮助你在打开的编辑器之间浏览。使用ctrl+page down或ctrl+page up可以浏览前后的选项卡,但是在很多文件打开的状态下,ctrl+e会更加有效率。


eclipse快捷键 10个最有用的快捷键

4. ctrl+2,L:为本地变量赋值

    开发过程中,我常常先编写方法,如Calendar.getInstance(),然后通过ctrl+2快捷键将方法的计算结果赋值于一个本地变量之上。 这样我节省了输入类名,变量名以及导入声明的时间。Ctrl+F的效果类似,不过效果是把方法的计算结果赋值于类中的域。

    5. alt+shift+r:重命名

    重命名属性及方法在几年前还是个很麻烦的事,需要大量使用搜索及替换,以至于代码变得零零散散的。今天的Java IDE提供源码处理功能,Eclipse也是一样。现在,变量和方法的重命名变得十分简单,你会习惯于在每次出现更好替代名称的时候都做一次重命名。要使 用这个功能,将鼠标移动至属性名或方法名上,按下alt+shift+r,输入新名称并点击回车。就此完成。如果你重命名的是类中的一个属性,你可以点击alt+shift+r两次,这会呼叫出源码处理对话框,可以实现get及set方法的自动重命名。

    6. alt+shift+l以及alt+shift+m:提取本地变量及方法

    源码处理还包括从大块的代码中提取变量和方法的功能。比如,要从一个string创建一个常量,那么就选定文本并按下alt+shift+l即可。如果同 一个string在同一类中的别处出现,它会被自动替换。方法提取也是个非常方便的功能。将大方法分解成较小的、充分定义的方法会极大的减少复杂度,并提 升代码的可测试性。

    7. shift+enter及ctrl+shift+enter

    Shift+enter在当前行之下创建一个空白行,与光标是否在行末无关。Ctrl+shift+enter则在当前行之前插入空白行。

    8. Alt+方向键

    这也是个节省时间的法宝。这个组合将当前行的内容往上或下移动。在try/catch部分,这个快捷方式尤其好使。

    9. ctrl+m

    大显示屏幕能够提高工作效率是大家都知道的。Ctrl+m是编辑器窗口最大化的快捷键。

    10. ctrl+.及ctrl+1:下一个错误及快速修改

    ctrl+.将光标移动至当前文件中的下一个报错处或警告处。这组快捷键我一般与ctrl+1一并使用,即修改建议的快捷键。新版Eclipse的修改建 议做的很不错,可以帮你解决很多问题,如方法中的缺失参数,throw/catch exception,未执行的方法等等。


eclipse快捷键 10个最有用的快捷键

更多快捷键组合可在Eclipse按下ctrl+shift+L查看。

posted @ 2013-06-11 15:28 love1563 阅读(1422) | 评论 (0)编辑 收藏

查阅了一下网络和博客园,发现还没有一个明确地指导源码管理提交准则的相关文章,因此斗胆整理了一部分自己平时开发管理的心得,加上查阅了部分英文资料写了一个不算很完善的SVN提交准则。

 

负责而谨慎地提交自己的代码

SVN更新的原则是要随时更新,随时提交。当完成了一个小功能,能够通过编译并且并且自己测试之后,谨慎地提交。

如果提交过程中产生了冲突,则需要同之前的开发人员联系,两个人一起协商解决冲突,解决冲突之后,需要两人一起测试保证解决冲突之后,程序不会影响其他功能。

如果提交过程中产生了更新,则也是需要重新编译并且完成自己的一些必要测试,再进行提交。

 

保持原子性的提交

每次提交的间歇尽可能地短,以一个小时,两个小时的开发工作为宜。如在更改UI界面的时候,可以每完成一个UI界面的修改或者设计,就提交一次。在开发功能模块的时候,可以每完成一个小细节功能的测试,就提交一次,在修改bug的时候,每修改掉一个bug并且确认修改了这个bug,也就提交一次。我们提倡多提交,也就能多为代码添加上保险。

 

不要提交自动生成的文件

Visual Studio在生成过程中会产生很多自动文件,如.suo等配置文件,Debug,Release,Obj等编译文件,以及其他的一些自动生成,同编译代码无关的文件,这些文件在提交的时候不应该签入,如果不小心签入了,需要使用Delete命令从仓库中删除。

 

不要提交不能通过编译的代码

代码在提交之前,首先要确认自己能够在本地编译。如果在代码中使用了第三方类库,要考虑到项目组成员中有些成员可能没有安装相应的第三方类库或者没有放入GAC(针对.Net Framework)中,项目经理在准备项目工作区域的时候,需要考虑到这样的情况,确保开发小组成员在签出代码之后能够在统一的环境中进行编译。

 

不要提交自己不明白的代码

代码在提交入SVN之后,你的代码将被项目成员所分享。如果提交了你不明白的代码,你看不懂,别人也看不懂,如果在以后出现了问题将会成为项目质量的隐患。因此在引入任何第三方代码之前,确保你对这个代码有一个很清晰的了解。

 

提前宣布自己的工作计划

在自己准备开始进行某项功能的修改之前,先给工作小组的成员谈谈自己的修改计划,让大家都能了解你的思想,了解你即将对软件作出的修改,这样能尽可能的减少在开发过程中可能出现的冲突,提高开发效率。同时你也能够在和成员的交流中发现自己之前设计的不足,完善你的设计。

 

对提交的信息采用明晰的标注

+) 表示增加了功能

*) 表示对某些功能进行了更改

-) 表示删除了文件,或者对某些功能进行了裁剪,删除,屏蔽。

b) 表示修正了具体的某个bug

posted @ 2013-02-14 19:43 love1563 阅读(5165) | 评论 (9)编辑 收藏

     摘要: J2EE层次设计架构实例的分析详解
  阅读全文

posted @ 2012-10-09 08:52 love1563 阅读(2696) | 评论 (1)编辑 收藏

     摘要: 大型网站的架构
  阅读全文

posted @ 2012-10-09 08:49 love1563 阅读(2176) | 评论 (0)编辑 收藏

     摘要: 系统、软件版本号大全  阅读全文

posted @ 2012-10-04 21:00 love1563 阅读(220) | 评论 (0)编辑 收藏

     摘要: 基于XMPP协议的手机多方多端即时通讯方案
  阅读全文

posted @ 2012-10-04 18:26 love1563 阅读(1560) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2011-05-29 23:50 love1563 阅读(2531) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2011-05-29 23:47 love1563 阅读(2640) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2011-02-25 10:54 love1563 阅读(258) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2010-08-19 01:48 love1563 阅读(164) | 评论 (0)编辑 收藏

http://www.jollen.org/blog/android_os/

posted @ 2010-07-16 09:28 love1563 阅读(241) | 评论 (0)编辑 收藏

http://www.chengyunfeng.com/page/1

posted @ 2010-07-15 11:23 love1563 阅读(170) | 评论 (0)编辑 收藏

http://hi.baidu.com/lfcaolibin/blog/category/Android/index/2

posted @ 2010-07-14 09:34 love1563 阅读(146) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2009-09-24 14:29 love1563 阅读(1277) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2009-09-24 14:25 love1563 阅读(1841) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2009-09-24 14:23 love1563 阅读(1382) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2009-09-10 20:56 love1563 阅读(129) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2009-09-10 20:52 love1563 阅读(482) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2009-09-10 20:34 love1563 阅读(999) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2009-09-09 16:33 love1563 阅读(178) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2009-09-09 16:28 love1563 阅读(358) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2009-05-07 15:18 love1563 阅读(233) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2009-04-30 15:27 love1563 阅读(459) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2009-04-30 11:53 love1563 阅读(12362) | 评论 (11)编辑 收藏

     摘要:   阅读全文

posted @ 2009-04-30 11:39 love1563 阅读(1279) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2009-04-29 15:23 love1563 阅读(373) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2009-04-29 14:25 love1563 阅读(198) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2009-04-29 14:22 love1563 阅读(236) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2009-04-29 13:35 love1563 阅读(843) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2009-04-20 13:33 love1563 阅读(181) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2009-04-16 09:59 love1563 阅读(166) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2009-04-15 10:39 love1563 阅读(160) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2009-04-13 09:35 love1563 阅读(180) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2009-04-08 21:53 love1563 阅读(201) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2009-04-07 10:24 love1563 阅读(192) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2009-03-30 14:59 love1563 阅读(1956) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2009-03-30 14:05 love1563 阅读(185) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2009-03-26 10:48 love1563 阅读(226) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2009-03-24 09:11 love1563 阅读(242) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2009-03-12 09:57 love1563 阅读(192) | 评论 (0)编辑 收藏

http://blog.csdn.net/xymyeah/archive/2009/02/26/3940807.aspx

posted @ 2009-03-11 12:30 love1563 阅读(187) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2009-03-10 17:30 love1563 阅读(955) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2009-03-06 16:18 love1563 阅读(140) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2009-03-05 15:18 love1563 阅读(274) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2009-03-05 14:27 love1563 阅读(242) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2009-03-05 14:18 love1563 阅读(184) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2009-03-05 09:37 love1563 阅读(336) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2009-03-05 09:02 love1563 阅读(473) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2009-03-05 08:59 love1563 阅读(295) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2009-03-04 14:18 love1563 阅读(248) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2009-02-25 17:17 love1563 阅读(297) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2009-02-25 14:29 love1563 阅读(204) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2009-02-25 11:09 love1563 阅读(1700) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2009-02-24 17:50 love1563 阅读(281) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2009-02-24 16:33 love1563 阅读(176) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2009-02-24 16:30 love1563 阅读(170) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2009-02-24 15:50 love1563 阅读(159) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2009-02-24 15:00 love1563 阅读(180) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2009-02-23 16:41 love1563 阅读(525) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2007-08-23 14:30 love1563 阅读(152) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2007-08-14 17:14 love1563 阅读(402) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2007-08-14 13:47 love1563 阅读(229) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2007-08-14 13:29 love1563 阅读(261) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2007-08-10 15:38 love1563 阅读(236) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2007-08-10 14:05 love1563 阅读(274) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2007-08-09 10:52 love1563 阅读(359) | 评论 (0)编辑 收藏

KzStepCounter.exe
UltraSnap.exe

posted @ 2007-08-09 09:36 love1563 阅读(408) | 评论 (1)编辑 收藏

     摘要:   阅读全文

posted @ 2007-08-08 15:31 love1563 阅读(393) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2007-08-08 14:21 love1563 阅读(616) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2007-08-08 09:49 love1563 阅读(487) | 评论 (1)编辑 收藏

     摘要:   阅读全文

posted @ 2007-08-07 13:08 love1563 阅读(1113) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2007-08-07 10:44 love1563 阅读(1831) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2007-08-06 16:46 love1563 阅读(270) | 评论 (0)编辑 收藏

http://www.jint.cn/

posted @ 2007-08-06 10:31 love1563 阅读(137) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2007-08-03 17:35 love1563 阅读(201) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2007-08-03 17:14 love1563 阅读(842) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2007-08-03 16:36 love1563 阅读(255) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2007-08-03 16:01 love1563 阅读(210) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2007-08-03 15:59 love1563 阅读(1411) | 评论 (3)编辑 收藏

     摘要:   阅读全文

posted @ 2007-08-03 10:59 love1563 阅读(317) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2007-08-03 10:17 love1563 阅读(886) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2007-08-01 14:01 love1563 阅读(187) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2007-08-01 14:01 love1563 阅读(228) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2007-08-01 12:58 love1563 阅读(426) | 评论 (0)编辑 收藏

     摘要: 149 、 JAVA 代码查错 1.abstract class Name {   private String name;   public abstract boolean isStupidName(String name) {}} 大侠们,这有何错误 ? 答案 :  ...  阅读全文

posted @ 2007-05-21 11:55 love1563 阅读(115) | 评论 (0)编辑 收藏

     摘要: 138 、 Java 的通信编程,编程题 ( 或问答 ) ,用 JAVA SOCKET ...  阅读全文

posted @ 2007-05-21 11:54 love1563 阅读(169) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2007-05-21 11:52 love1563 阅读(487) | 评论 (0)编辑 收藏

148 将一个键盘输入的数字转化成中文输出
(例如:输入:1234567     输出:一百二拾三万四千五百六拾七)
java语言实现,,请编一段程序实现!
 public class Reader {
  private String strNum;
  private String strNumChFormat;
  private String strNumTemp;
  private int intNumLen;
  private String strBegin;
  public Reader(String strNum) {
    this.strNum = strNum;
  }
  public boolean check(String strNum) {
    boolean valid = false;
    
    if (strNum.substring(0,1).equals("0")){
     this.strNum = strNum.substring(1);
    }
    try {
      new Double(strNum);
      valid = true;
    }
    catch (NumberFormatException ex) {
      System.out.println("Bad number format!");
    }
    return valid;
  }
  public void init() {
    strNumChFormat = "";
    intNumLen = strNum.length();
    strNumTemp = strNum;
    strNumTemp = strNumTemp.replace('1', '');
    strNumTemp = strNumTemp.replace('2', '');
    strNumTemp = strNumTemp.replace('3', '');
    strNumTemp = strNumTemp.replace('4', '');
    strNumTemp = strNumTemp.replace('5', '');
    strNumTemp = strNumTemp.replace('6', '');
    strNumTemp = strNumTemp.replace('7', '');
    strNumTemp = strNumTemp.replace('8', '');
    strNumTemp = strNumTemp.replace('9', '');
    strNumTemp = strNumTemp.replace('0', '');
    strNumTemp = strNumTemp.replace('.', '');
    strBegin = strNumTemp.substring(0, 1);
  }
  public String readNum() {
    if (check(strNum)) {
      init();
      try {
        for (int i = 1, j = 1, k = 1; i < intNumLen; i++) {
          if (strNumTemp.charAt(intNumLen - 1) == '' && i == 1) {
            strNumChFormat = "";
          }
          else if (strNumTemp.charAt(intNumLen - i) == '' && j == 1) {
            strNumChFormat = "" + strNumChFormat;
          }
          else if (strNumTemp.charAt(intNumLen - i) == '') {
            j = 1;
            k = 1;
            strNumChFormat = strNumTemp.charAt(intNumLen - i) + strNumChFormat;
            continue;
          }
          else {
            strNumChFormat = strNumTemp.charAt(intNumLen - i) + strNumChFormat;
          }
          if (strNumTemp.charAt(intNumLen - i - 1) != '' &&
              strNumTemp.charAt(intNumLen - i - 1) != '') {
            if (j == 1 && i < intNumLen) {
              strNumChFormat = '' + strNumChFormat;
            }
            else if (j == 2 && i < intNumLen) {
              strNumChFormat = '' + strNumChFormat;
            }
            else if (j == 3 && i < intNumLen) {
              strNumChFormat = '' + strNumChFormat;
            }
          }
          if (j == 4 && i < intNumLen) {
            j = 0;
          }
          if (k == 4 && i < intNumLen) {
            strNumChFormat = '' + strNumChFormat;
          }
          else if (k == 8 && i < intNumLen) {
            k = 0;
            strNumChFormat = '亿' + strNumChFormat;
          }
          j++;
          k++;
        }
        while (strNumChFormat.indexOf("") != -1) {
          strNumChFormat = strNumChFormat.replaceAll("", " ");
        }
        if (strNumChFormat.substring(0, 2) == "一拾") {
          strNumChFormat = strNumChFormat.substring(1, strNumChFormat.length());
        }
        if (strNumChFormat.indexOf("") >= 0) {
          String rebegin = strNumChFormat.substring(0,
              strNumChFormat.indexOf(""));
          String relast = strNumChFormat.substring(strNumChFormat.indexOf(""),
              strNumChFormat.length());
          for (int i = 1; i <= relast.length(); i++) {
            relast = relast.replaceAll("", "");
            relast = relast.replaceAll("", "");
            relast = relast.replaceAll("", "");
            relast = relast.replaceAll("", "");
            relast = relast.replaceAll("亿", "");
          }
          strNumChFormat = rebegin + relast;
        }
      }
      catch (ArrayIndexOutOfBoundsException ex) {
        ex.printStackTrace();
      }
      catch (Exception ex) {
        ex.printStackTrace();
      }
      int off = strNumChFormat.indexOf("");
      strNumChFormat = strBegin + strNumChFormat.substring(0);
    }
    else {
      strNumChFormat = "";
    }
    return strNumChFormat;
  }
  public static void main(String args[]) {
    try {
      String number = args[0].toString();
      System.out.println("The number is: " + number);
      Reader reader = new Reader(number);
      System.out.println("Output String: " + reader.readNum());
    }
    catch (Exception ex) {
      System.out.println("Please input like that: javac Reader <number>");
    }
  }
}

posted @ 2007-05-21 11:36 love1563 阅读(763) | 评论 (0)编辑 收藏

 

提纲:
1、版权声明
2、前言
3、正文
4、结论
5、附注
6、参考资料

=======================================================

1、版权声明:
  本文作者:little,原始出处:用"堆栈区数据复制"理解Java赋值和参数传递机制的心得 ([link]http://java.learndiary.com/disDiaryContentAction.do?goalID=2716[/link]),邮件:mdx-xx@tom.com。如有任何反馈意见请联系作者,作者会在本文原始出处随时更新此文。转载及引用请保留此版权声明,谢谢。

2、前言:
  关于Java的赋值和参数传递是按值(by value)进行的还是按引用(by reference)进行的,这个问题曾经迷惑了很多人,包括我。而且,我想,这个问题还将继续迷惑一些人,包括那些C++的高手。
  在这里,我不准备用“按值(by value)”和“按引用(by value)”这样的术语来阐述这个问题。因为,从字面的理解来看,这样的术语在不同的人头脑里有不同的含义。我试图从Java数据(包括原始类型(primitive type)和对象(ojbect))在内存中的存储这个角度,用一个自创的“术语”来阐述我对这个问题的理解。这个术语就是:“堆栈区数据复制(Stack Data Copy,简称SDC)”。详细一点就是:在Java中,不管是赋值操作还是参数传递操作--针对原始类型(primitive type),是对堆栈区的原始类型的值进行复制;针对对象,是对储存在堆栈区的,对象的引用中所储存的对象的值的地址进行复制。
  像上面抠字眼的句子读起来比较费力,我在后面将用两个例子并结合一些示意图来阐述我对这个问题的理解。希望各位朋友帮助纠正错误。

3、正文:
1)、赋值操作:
例子源码:(Assign.java)

  1. public  class Assign{
  2.   public static void main(String[] args){
  3.     int i = 1;
  4.     Object o = new Object();
  5.     System.out.println("i = " + i + " ; o = " + o ); // Step 1 (示意图:3-1-1)
  6.     int j = i;   
  7.     Object p = o;
  8.     System.out.println("i = " + i + " ; j = " + j + " ; o = " + o + " ; p = " + p); //Step 2 (示意图:3-1-2)
  9.     j++;
  10.     p = new Object();
  11.     System.out.println("i = " + i + " ; j = " + j + " ; o = " + o + " ; p = " + p); //Step 3 (示意图:3-1-3)
  12.   }
  13. }


对上面例子的说明:
(1),Step 1中,整数i和对象o得到赋值。

示意图3-1-1

 
chart3-1-1.bmp
从示意图3-1-1中可以看出:整数i存储在堆栈区(Stack);对象o的引用存储在了堆栈区,但是对象o的值却存储在了内存堆中(Heap),对象o的引用存储了对象o的地址。
Step 1在我的机器上的一次输出结果:
  1. i = 1 ; o = java.lang.Object@a90653

至于对象o的值输出来怎么会是那个样子,我只能告诉您:在java程序的一次运行过程中,每个Object对象输出这样的值是唯一的,因此可以借此来判断对象的引用指向的对象是否发生了改变。详情请参考Java API 文档(下同,这里给出的是:J2SE 1.5.0 API 中文版):
[link]http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/io/PrintStream.html#println(java.lang.Object)[/link]
[link]http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/lang/Object.html#toString()[/link]
(2),Step 2中,把整数i赋值给了整数j,把对象o赋值给了对象p。

示意图3-1-2

chart3-1-2.bmp

从示意图3-1-2中可以看出:整数i的值复制给了整数j,整数j同样存储在堆栈区;存储在堆栈区的对象o的引用中存储的对象o的地址C复制给了对象p的引用,对象p的引用同样在堆栈区中。因为对象p的引用得到了对象o的引用复制过来的对象o的值的存储地址C,所以对象p的引用和对象o的引用都指向了在堆(heap)中的同一个对象,并且,这个对象的地址是地址C。
Step 2在我的机器上的一次输出结果:
  1. i = 1 ; j = 1 ; o = java.lang.Object@a90653 ; p = java.lang.Object@a90653

(3),Step 3中,整数j的值加1,赋给了对象p新的对象值。

示意图3-1-3

chart3-1-3.bmp

从示意图3-1-3中可以看出:整数i的值不变,整数j的值加1变为2,整数在堆栈区中;新生成的对象的值存储在了堆(Heap)中,地址为F。新生成对象的地址F存储在了堆栈区p的引用中,替换了原来存储在其中的地址C。于是,p的引用就指向了新生成的对象,这个新生成的对象的地址是地址F。而整数i和对象o的?(包括对象o的引用)没有改变也不曾有任何改变(除了初次赋值)。
Step 3在我的机器上的一次输出结果:
  1. i = 1 ; j = 2 ; o = java.lang.Object@a90653 ; p = java.lang.Object@de6ced


至此,通过上面的例子及其示意图和说明,我得到一个结论:
在Java赋值操作中,针对原始类型(primitive type),是对堆栈区的原始类型的值进行复制;针对对象,是对储存在堆栈区的,对象的引用中所储存的对象的值的地址进行复制。这就是术语:“堆栈区数据复制(Stack Data Copy,简称SDC)”在Java赋值操作中的阐述。

2)、方法中的参数传递操作:
例子源码:(PassParameter.java)
  1. public class PassParameter{
  2.   static void showMe(int pi, Object po){
  3.     System.out.println("pi = " + pi + " ; po = " + po); // Step 2 (示意图:3-2-2)
  4.     pi++;
  5.     po = new Object();
  6.     System.out.println("pi = " + pi + " ; po = " + po); // Step 3 (示意图:3-2-3)
  7.   }
  8.   public static void main(String[] args){
  9.     int i = 1;
  10.     Object o = new Object();
  11.     System.out.println("i = " + i + " ; o = " + o); // Step 1 (示意图:3-1-1)
  12.     showMe(i, o);
  13.     System.out.println("i = " + i + " ; o = " + o); // Step 4 (示意图:3-2-3)
  14.   }
  15. }


对上面例子的说明:
(1),Step 1中,与上面Assign.java中的Step 1相同,略,下面重复其示意图3-1-1。

示意图3-1-1

chart3-1-1.bmp
 

Step 1在我的机器上的一次输出结果:
  1. i = 1 ; o = java.lang.Object@a90653

(2),Step 2中,与上面Assign.java中的Step 2类似,只是Assign.java中的整数j和对象p变成了这里的方法showMe()中的参数:整数pi和对象po。并且,由于这里是参数传递,把Assign.java示意图3-1-2中的“=”替换成PassParameter.java示意图3-2-2中的“<--”,以此表示是参数传递。据我的理解,它们是一回事。

示意图3-2-2

chart3-2-2.bmp

Step 2在我的机器上的一次输出结果:
  1. pi = 1 ; po = java.lang.Object@a90653

(3),Step 3和Step 4合并起来,见示意图3-2-3同样,与上面Assign.java中的Step 3类似。

示意图3-2-3

 chart3-2-3.bmp

Step 3和Step 4在我的机器上的一次输出结果:
  1. pi = 2 ; po = java.lang.Object@de6ced
  2. i = 1 ; o = java.lang.Object@a90653


至此,通过上面的例子及其示意图和说明,我得到一个结论:
在Java方法参数传递操作中,针对原始类型(primitive type),是对堆栈区的原始类型的值进行复制;针对对象,是对储存在堆栈区的,对象的引用中所储存的对象的地址的值进行复制。这就是术语:“堆栈区数据复制(Stack Data Copy,简称SDC)”在Java方法参数传递操作中的阐述。

4,结论
综上所述:在Java中,不管是赋值操作还是方法的参数传递操作--针对原始类型(primitive type),是对堆栈区的原始类型的值进行复制;针对对象,是对储存在堆栈区的,对象的引用中所储存的对象的值的地址进行复制。
所以,据我的理解,术语:“堆栈区数据复制(Stack Data Copy,简称SDC)”能够有助于理解在Java中进行赋值和传递参数的机制,能够有助于在一定程度上消除“传值”、“传引用”等语义上的多变性的负面影响,可以提出来供大家交流。

5,附注:
由于本人水平有限,上面的一切全是基于实践进行的带有一些推测成分在内的个人心得总结。我也以上面的自创术语去成功解释过一些文章中的有关问题(如下面参考资料中的例程)。谨希望在能为部分Java初学者提供一个理解Java赋值和参数传递的手段的同时,更能得到各位朋友的斧正,以便能够对这个问题形成更加正确和准确的认识。在我提高认识的同时,我会在本文原始出处:用"堆栈区数据复制"理解Java赋值和参数传递机制的心得 ([link]http://java.learndiary.com/disDiaryContentAction.do?goalID=2716[/link])中随时更新此文。再次贴出我的邮件:mdx-xx@tom.com。谢谢。

6,参考资料:

1),Java参数传递方式 ([link]http://www.jiehoo.com/java-pass-parameter.htm[/link])
2),破除java神话之二:参数是传址的 ([link]http://www.javaresearch.org/article/showarticle.jsp?column=544&thread=443[/link])
3),Java 应用程序中的按值传递语义 ([link]http://www.javaresearch.org/article/showarticle.jsp?column=1&thread=706[/link])
4),我对《Java 应用程序中的按值传递语义》的理解 ([link]http://www.javaresearch.org/article/showarticle.jsp?column=1&thread=3156[/link])
5),Thinking in Java, 3rd Edition in Java ([download]http://www.mindviewinc.com/downloads/TIJ-3rd-edition4.0.zip[/download])

                                                              全文完
                                                              2006年11月22日午    

posted @ 2007-05-19 17:30 love1563 阅读(355) | 评论 (0)编辑 收藏

在项目开发中经常会用到生成指定格式的excel报表的问题.
示例代码如下:
Code:
//首先创建一个文件输出流
 FileOutputStream fop = new FileOutputStream("D:\\test.xls");
         
         HSSFWorkbook hsfwb = new HSSFWorkbook();
         HSSFSheet hs = hsfwb.createSheet();
         HSSFCellStyle cs = hsfwb.createCellStyle();
         //设置背景的style
         cs.setFillPattern(HSSFCellStyle.ALIGN_LEFT);
         cs.setFillForegroundColor(HSSFColor.BRIGHT_GREEN.index);
 
         //创建一个名字为test的sheet
         hsfwb.setSheetName(0,"test");
         hsfwb.setSheetName(1,"sorunxian");
         HSSFRow row = hs.createRow(0);
         
         //设置cell的背景颜色
         HSSFCellStyle hfcs = hsfwb.createCellStyle();
         hfcs.setFillForegroundColor(HSSFColor.BLUE.index);
         
         HSSFCell cell = row.createCell((short) 0);
         
         //给excel的单元格设值
         cell.setCellValue("My name is du juan~~~");
         //给excel的单元格设置样式(这个程序里面的背景色)
         cell.setCellStyle(cs);
         row.createCell((short) 1).setCellValue("sorunxian");
               
         //将数据写入文件中
         hsfwb.write(fop);
         //关闭流,释放相关资源
         fop.close();


相关类介绍:
HSSF提供给用户使用的对象在org.apache.poi.hssf.usermodel包中,主要部分包括Excell对象,样式和格式,还有辅助操作。有以下几种对象:
HSSFWorkbook excell的文档对象
HSSFSheet excell的表单
HSSFRow excell的行
HSSFCell excell的格子单元
HSSFFont excell字体
HSSFName 名称
HSSFDataFormat 日期格式
在poi1.7中才有以下2项:
HSSFHeader sheet头
HSSFFooter sheet尾
和这个样式
HSSFCellStyle cell样式
辅助操作包括
HSSFDateUtil 日期
HSSFPrintSetup 打印
HSSFErrorConstants 错误信息表
poi HSSF的实现也遵循MVC模型.

posted @ 2007-05-12 17:01 love1563 阅读(589) | 评论 (0)编辑 收藏

データベース設計

紹介:
詳細設計のもう 一つ重要な作業はデータベース設計である。
データベース設計の目的は永続的なオブジェクトをどういうふうに
データベースに格納したり、アクセスしたりするかを決定することである。
そのため、データベースのスキーマ、あるいはテーブルおよび項目や
タイプの定義、テーブル間の関係、テーブルの正規化、および検証ルール
などを検討しなければならない。

単語:
データベース設計 database design 数据库设计
永続的 えいぞくてき 持久性的
格納する かくのうする 存放
スキーマ schema 定义,格式,格局
タイプ type 类型
正規化 せいきか 规范化,范式
検証ルール けんしょうルール 验证规则
後回し あとまわし 滞后,回头再作
不可欠な ふかけつな 不可缺少的
性格 せいかく 性质,性格
帳票 ちょうひょう 表单
入力 にゅうりょく 输入
照会 しょうかい 查询
先行する せんこうする 先执行
ビジネス.ロジック business logic 业务逻辑
クラス設計 类的设计
改訂する かいていする 修改,修订
候補 こうほ 候补,候选
構成属性 こうせいぞくせい 合成的属性
属性 ぞくせい  構成 こうせい
矛盾 むじゅん 矛盾,与...不符合
ゴール goal 目标,目的
外部キー foreign key 外键
主キー  primary key 主键
方法論 ほうほうろん 方法论
定める さだめる 确定
ORM 对象关系映射
生産性 せいさんせい 生产率
別々 べつべつ 各自,分别
わざわざ 特地,刻意
汎化関係 はんかかんけい 一般化关系
用意する よういする 准备,预备
役立つ やくだつ 起作用,有效
作業もの さぎょうもの 工作的成果

posted @ 2007-05-12 16:57 love1563 阅读(308) | 评论 (0)编辑 收藏

一般情况下,对日软件开发的流程如下:
SA 系统分析
RD 要件定义
UR User要件
SR 系统要件定义
BD 基本设计
FD 功能设计
PD 程序设计
UT 单体测试
CT 结合测试
ST 系统测试
OT 机能测试
DV 产品出荷

OK,以上です。

posted @ 2007-05-12 16:46 love1563 阅读(1160) | 评论 (0)编辑 收藏

一、Servlet过滤器的概念:
***************************************************************************************
Servlet过滤器是在Java Servlet规范2.3中定义的,它能够对Servlet容器的请求和响应对象进行检查和修改。   

Servlet过滤器本身并不产生请求和响应对象,它只能提供过滤作用。Servlet过期能够在Servlet被调用之前检查Request对象,修改Request Header和Request内容;在Servlet被调用之后检查Response对象,修改Response Header和Response内容。

Servlet过期负责过滤的Web组件可以是Servlet、JSP或者HTML文件。 
***************************************************************************************


二、Servlet过滤器的特点:
***************************************************************************************
A.Servlet过滤器可以检查和修改ServletRequest和ServletResponse对象
B.Servlet过滤器可以被指定和特定的URL关联,只有当客户请求访问该URL时,才会触发过滤器
C.Servlet过滤器可以被串联在一起,形成管道效应,协同修改请求和响应对象
***************************************************************************************


三、Servlet过滤器的作用:
***************************************************************************************
A.查询请求并作出相应的行动。
B.阻塞请求-响应对,使其不能进一步传递。
C.修改请求的头部和数据。用户可以提供自定义的请求。
D.修改响应的头部和数据。用户可以通过提供定制的响应版本实现。
E.与外部资源进行交互。
***************************************************************************************


四、Servlet过滤器的适用场合:
***************************************************************************************
A.认证过滤
B.登录和审核过滤
C.图像转换过滤 
D.数据压缩过滤 
E.加密过滤 
F.令牌过滤 
G.资源访问触发事件过滤 
H.XSL/T过滤 
I.Mime-type过滤
***************************************************************************************


五、Servlet过滤器接口的构成:
***************************************************************************************
所有的Servlet过滤器类都必须实现javax.servlet.Filter接口。这个接口含有3个过滤器类必须实现的方法:

A.init(FilterConfig):
这是Servlet过滤器的初始化方法,Servlet容器创建Servlet过滤器实例后将调用这个方法。在这个方法中可以读取web.xml文件中Servlet过滤器的初始化参数

B.doFilter(ServletRequest,ServletResponse,FilterChain):
这个方法完成实际的过滤操作,当客户请求访问于过滤器关联的URL时,Servlet容器将先调用过滤器的doFilter方法。FilterChain参数用于访问后续过滤器

B.destroy():
Servlet容器在销毁过滤器实例前调用该方法,这个方法中可以释放Servlet过滤器占用的资源
***************************************************************************************


六、Servlet过滤器的创建步骤:
***************************************************************************************
A.实现javax.servlet.Filter接口
B.实现init方法,读取过滤器的初始化函数
C.实现doFilter方法,完成对请求或过滤的响应
D.调用FilterChain接口对象的doFilter方法,向后续的过滤器传递请求或响应
E.销毁过滤器
***************************************************************************************


七、Servlet过滤器对请求的过滤:
***************************************************************************************
A.Servlet容器创建一个过滤器实例
B.过滤器实例调用init方法,读取过滤器的初始化参数
C.过滤器实例调用doFilter方法,根据初始化参数的值判断该请求是否合法
D.如果该请求不合法则阻塞该请求
E.如果该请求合法则调用chain.doFilter方法将该请求向后续传递
***************************************************************************************


八、Servlet过滤器对响应的过滤:
***************************************************************************************
A.过滤器截获客户端的请求
B.重新封装ServletResponse,在封装后的ServletResponse中提供用户自定义的输出流
C.将请求向后续传递
D.Web组件产生响应
E.从封装后的ServletResponse中获取用户自定义的输出流
F.将响应内容通过用户自定义的输出流写入到缓冲流中
G.在缓冲流中修改响应的内容后清空缓冲流,输出响应内容
***************************************************************************************

九、Servlet过滤器的发布:
***************************************************************************************
A.发布Servlet过滤器时,必须在web.xml文件中加入<filter>元素和<filter-mapping>元素。

B.<filter>元素用来定义一个过滤器:
属性                   含义
filter-name    指定过滤器的名字
filter-class    指定过滤器的类名
init-param    为过滤器实例提供初始化参数,可以有多个

C.<filter-mapping>元素用于将过滤器和URL关联:
属性                     含义
filter-name    指定过滤器的名字
url-pattern    指定和过滤器关联的URL,为”/*”表示所有URL
***************************************************************************************


十一、Servlet过滤器使用的注意事项
***************************************************************************************
A.由于Filter、FilterConfig、FilterChain都是位于javax.servlet包下,并非HTTP包所特有的,所以其中所用到的请求、响应对象ServletRequest、ServletResponse在使用前都必须先转换成HttpServletRequest、HttpServletResponse再进行下一步操作。

B.在web.xml中配置Servlet和Servlet过滤器,应该先声明过滤器元素,再声明Servlet元素


C.如果要在Servlet中观察过滤器生成的日志,应该确保在server.xml的localhost对应的<host>元素中配置如下<logger>元素:
<Logger className = “org.apache.catalina.logger.FileLogger”
directory = “logs”prefix = “localhost_log.”suffix=”.txt”
timestamp = “true”/>
***************************************************************************************

posted @ 2007-04-23 12:03 love1563 阅读(191) | 评论 (0)编辑 收藏