我本人一直以来犯的错误,在看了《Think In Java》后才抓了出来(转)
也许你是只老鸟,也许你的程序编的很精,但是,在你的程序生活,你也许没有注意到一些“常识性”的问题,因为有些时候我们不需要去注意,我们的程序 照样能够运行得飞快,但是如果那天有一个无聊的人问你一个像这样的问题,本来他是非常崇拜你的,可是因为你的一个疏忽就从他的心理掉价了。呵呵,开个玩 笔,有一些东西我们还真的不得不注意,因为说不定我们那天就在这个小沟里翻了。我个人也是个CODER,一直被外界的一些花哨的东西所忽悠着,一直就没有 心来看这些书,大致一翻,都懂,没有什么看的。但是,懂是懂的,可是有很多的所以然,还真的说不出来。
1、Java里面默认值的误解:
这是Eclipse下面的一张切图,我相信你是很熟悉的,JAVA里面不是说,当变量没有赋值不是有自动的默认值,为什么会在下面出错呢!?:
这 个不是SUN公司的错,怪只怪我们没有仔细看文档,因为我们所看的书中都可能是这样的说“如果没有分配值,系统会为变量自动分配置默认值”,我们就信以为 真了,有些地方也确实是行得通的,在有时编程的时候也遇到没有赋值就编译通示过的提示,也没有多去想。这个所说的默认值是指类成员变量在没有赋值的时候会赋以默认值,其它局部变量是不能够享受这种待遇的。这下懂了吧,为什么会出错了,这里一定要给以初使值才行。
2、很少使用接口
当然这不是说我有这处毛病,你们就有,我只是说我自己,以免在黑暗中被拍了砖头@。至少我相信有一大部朋友是这样的,拿到一个东西,就直接在类里面去实现,因为为什么呢?没有必要吗,为什么要去多写一个接口呢,这不是明摆着给自己找麻烦吗?
说实话,就在写这篇自我反省以前,我一直都是这样的,可以说是从来没有写过接口,也许您会说,“从来没有写过接口也算是学JAVA”,不过不管你怎么说, 确实没有写过,所有写的都是直接在类中实现(注:我这里指的类表示非接口类)。如果有些小程序,确实不需要写,因为实现也很简单,也可能以后不需要继承, 也不需要在以后的某年某月再次重新优化一下,当然没有必要了。
可是,这是一个习惯问题,当你走路习惯了左边,那你走路的时候就不会走右边, 你就会在不知觉中去和车车亲个嘴。我们应该培养自己的这种思维,让我们不管在大小项目中,都会想到要这么做。有句古话叫“一屋不扫,何以扫天小”就是这个 道理,而不是报以“大丈夫不拘小节”的态度。
你可能对这个为什么要写接口还是不明白,就像《Think In Java》这样说的,“如果你现在写了一个功能,以后发现这个功能执行起来速度不理想的时候,如果你去代码中改,那有可能会是增加BUG进去,如果我们使 用了接口,就不用这么麻烦了,方法重写就很好办”,我想也是这样的,我就经常犯这样的错误,有些时候随着时间的推移,连自己写的程序,逻辑都还要慢慢去 理。
3、让一个类去做特定的事情
在《Think In Java》提到,把每个对象都当成服务的提供者,为什么这样说呢?还是说现实的比喻吧,就像是一个人,我们如果希望他什么都会,结果也可能是他什么都会, 但是没有一样东西是能够拿出手的,都是半懂。而如果把这些东西分给多个人去学习,只要他们每人学自己那一部份,结果是每个人懂得都不是那么多,也不会有那 么大的心理负担去学习,最后都学得很精,结果综合的深度,每个人都能够独挡一面,就是这个道理。
我个人也是经常犯这样的错误,有些时候,一个类下来,什么乱七八糟的功能都有,结果后来多得连自己有时都分不清楚,那些方法在用,那些方法没有用了。
4、根本不注重合理使用访问控制:public, private, protected
我自己写程序的时候,想到什么样方便,就怎么样使用,特别是对于类变量,不管定义成PUBLIC还是 PRIVATE,都可以在当前类中使用无阻,这也应该就是让我不注意的原因吧。如果完全是自己使用,可能出错的机率不会太大,因为个人对这个应该还是熟悉 的,但是如果你的应用程序需要发布,用户来使用就会出错,因为他们调用一个不能够独立执行的方法或者是变量。又或者是一个本来不需要对外公开的方法,你对 外公开了,外面的用户使用了,而在你后面的版本中,你又把这个方法更改了,那么使用者在调用这个方法的时候就会出错,至少你写的程序分健壮性就要打个问号 了。
这是我现在发现的个人毛病,挑出来,希望以后不要再犯。最后见意,有经验的程序员,不要忘了看看《Think In Java》,因为你们更容易犯错,而在自己的错误中生存下去。
我本人一直以来犯的错误,在看了《Think In Java》后才抓了出来(转)的更多相关文章
- android升级后错误:Unable to execute dex: java.nio.BufferOverflowException.Check
Android SDK Tools升级为22.3,Android SDK Platform-tools 升级为19后,编译工程出现错误: Unable to execute dex: java.nio ...
- Atitit.dwr3 不能显示错误具体信息的解决方式,控件显示错误具体信息的解决方式 java .net php
Atitit.dwr3 不能显示错误具体信息的解决方式,控件显示错误具体信息的解决方式 java .net php 1. Keyword/subtitle 1 2. 使用dwr3的异常convert处 ...
- Java 错误提示org.apache.poi.POIXMLException: java.lang.reflect.InvocationTargetException
java 操作excel文件 发布后报错 org.apache.poi.POIXMLException: java.lang.reflect.InvocationTargetException XSS ...
- jdk1.7安装,cmd下 java -version出现错误:“could not open `D:\Java\jre7\lib\amd64\jvm.cfg”
cmd 下java -version出现错误:“could not open `D:\Java\jre7\lib\amd64\jvm.cfg”,出现这种错误可能是由于先前有安装老版本jdk,之后将新版 ...
- DiscuzX2.5密码错误次数过多,请 15 分钟后重新登录的修改办法
source\function function_login.php $return = (!$login || (TIMESTAMP - $login['lastupdate'] > )) ? ...
- MyBatis3错误:Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/log4j/Priority的问题解决
在使用Maven新建QuitStart类型项目时,引入了MyBatis3.2.0版本的JAR包之后,出现如下错误: Exception in thread "main" java. ...
- .NET Framework 3.5 无法安装以下功能 安装错误:0x800F0906(客户端加域后出现)
问题:安装错误:0x800F0906 系统安装并加域后,在安装用友软件时提示没有.net 3.5 系统为win10 但是,点击确定后,却出现了这样的错误.如下: 点击下载并安装此功能,出现了这样 ...
- JAVA错误:Exception in thread "main" java.lang.NullPointerException
JAVA错误:Exception in thread "main" java.lang.NullPointerException例如: Exception in thread &q ...
- iOS开发中遇到的错误整理 - 集成第三方框架时,编译后XXX头文件找不到
iOS编译报错-XXX头文件找不到 错误出现的情况: 自己在继承第三方的SDK的时候,明明导入了头文件,但是系统报错,提示头文件找不到 解决方法 既然系统找不到,给他个具体路径,继续找去! 路径就填写 ...
随机推荐
- Android通过HTTP POST带參訪问asp.net网页
在看了网络上非常多视频关于android通过HTTP POST或者GET方式訪问网页并获取数据的方法. 自己也copy了一份来測试.并通过C#.NET搭建了一个简单的后台,但发现传參时,依照网上的方式 ...
- [week1]每周总结与工作计划
实在不想说这句俗话,因为实在太俗了.但是俗话说,“吾日三省吾身”,我虽然难以做到每天反省那么多次,但是每周来一次就很不错了.于是我决定: 从这周开始准备每周都写每周总结与工作计划. 很好,就这样说定了 ...
- Android长方形图片生成正圆形,以及矩形图片生成圆角
一般要做正圆形图片,只能是正方形的基础上才能实现,否则就变成椭圆了,下面说说如何使长方形的图片生成正圆形图片 废话不多说,没图没真相,先上图吧: 原图: 变成正圆后: 下面上代码: public ...
- To restore the database on a new host-将数据库恢复至一个新的主机上
To restore the database on a new host:1. Ensure that the backups of the target database are accessib ...
- JavaScript定时机制setTimeout与setInterval研究
JavaScript的setTimeout与setInterval是两个很容易欺骗别人感情的方法,因为我们开始常常以为调用了就会按既定的方式执行, 我想不少人都深有同感, 例如 setTimeout( ...
- Git教程--Git分支管理
分支管理--原理分析 在前面讲到的版本回退里,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支.只有一条时间线的这条分支称为master,HEAD严格来说不是指向提交,而是指向maste ...
- LPC同STM32的比较
Cortex-M3是新兴起来的一种ARM7的核,而ARM7TDMI是一种传统的经典的ARM内核.我们就抛开这一切,来比较一下两则的异同. 我们就在以下平台上比较吧: STMicoelectronics ...
- 联想企业网盘:SaaS服务集群化持续交付实践
1 前言 当代信息技术飞速发展,软件和系统的代码规模都变得越来越大,而且组件众多,依赖繁复,每次新版本的发布都仿佛是乘坐一次无座的绿皮车长途夜行,疲惫不堪.软件交付是一个复杂的工程,涉及到软 ...
- docker网络-如何让外部网络访问容器资源
docker网络-如何让外部网络访问容器资源 安装httpd 服务: docker:/root# docker exec -it f63b2633d146 bash bash-4.1# yum ins ...
- CGFloat,CGPoint,CGSize,CGRect
1.数据类型: CGFloat: 浮点值的基本类型 CGPoint: 表示一个二维坐标系中的点 CGSize: 表示一个矩形的宽度和高度 CGRect: 表示一个矩形的位置和大小 typedef fl ...