
正文
java高质量代码的特点 java高质量代码的特点是什么
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
编写高质量代码 改善java程序的151个建议怎么样
一种编程语言的重要性并不在于语言本身java高质量代码的特点,而是在于这种语言来体现出来的编程思维模式。
《编写高质量代码
改善Java程序的151个建议》是一本关于Java最佳实践的集大成之作java高质量代码的特点,它从Java语言本身、Java程序的架构设计和思想、Java程序的编码规
范和习惯等方面对151个经典的问题给出java高质量代码的特点了解决方案,为Java开发者提高开发效率和编写高质量的Java代码提供了宝贵的建议。
相关问答
Q1: java学习:如何写出高质量的代码,成功进入BAT
很多问题归根结底都是技术债务,这在一些大公司尤为常见。技术债务话题太大,但就代码质量而言,我只想提一下不要因为这些债是前人留下的你就不去管。怎么写出高质量的代码呢?
1、打好技术基础
写出高质量代码,并不是搭建空中楼阁,需要有一定的基础。这里我重点强调与代码质量密切相关的几点:
1)掌握好开发语言
比如做 Android 就必须对 Java 足够熟悉,才能够写出高质量 Java 代码。
2)熟悉开发平台
不同的开发平台,有不同的 API,有不同的工作原理,同样是 Java 代码,在 PC 上写与 Android 上写很多地方不一样。
3)要去熟悉 Android 编程的一些特性
iOS 编程的一些特性,了解清楚这些,才能写出更加地道的代码,充分发挥各自平台的优势。
4)基础的数据结构与算法
掌握好这些在解决一些特定问题时,可以以更加优雅有效的方式处理。
5)基础的设计原则
无需完全掌握 23 种经典设计模式,只需要了解一些常用的设计原则即可,甚至你也可以只了解什么是低耦合,并在你的代码中坚持实践,也能写出很不错的代码。
2、代码标准
代码标准在团队合作中尤为重要,谁也不希望一个项目中代码风格各异,看得让人糟心,即便是个人开发者,现在也需要跟各种开源项目打交道。
标准怎么定是一个老生常谈的话题,我经历过很多次的代码标准讨论会议,C++,C#,Java 等等,大家有时会坚持自己的习惯不肯退让。可现如今时代不一样了,Google 等大厂已经为我们制定好了各种标准,就用这些业界标准吧。
3、想好再写
除非你很清楚你要怎么做,否则我不建议边做边想。你真的搞清楚你要解决的问题是什么了吗?你的方案是否能有效?有没有更优雅简单的方案?
准备怎么设计它,必要的情况下,需要有设计文档,复杂一些的设计需要有同行评审,写代码其实是很简单的事情,前提是你得先想清楚。
4、代码重构
重构对于代码质量的重要性不言而喻,很难一次把代码写得让自己满意、无可挑剔。
5、技术债务
很多问题归根结底都是技术债务,这在一些大公司尤为常见。技术债务话题太大,但就代码质量而言,我只想提一下不要因为这些债是前人留下的你就不去管。
现实是没有多少机会让你从一个清爽清新的项目开始做起,你不得不去面对这些,你也没法完全不跟这些所谓的烂代码打交道。
当你负责一个小模块时,除了把它做好之外,也要顺便将与之纠缠在一起的技术债务还掉,因为这些债务最终将是整个团队来共同承担,任何一个人都别想独善其身,如果你还对高质量代码有追求的话。
作为团队的技术负责人,也要顶住压力,鼓励大家勇于做出尝试,引导大家不断改进代码质量,不要总是畏手畏脚,停滞不前,真要背锅也得上,要有担当。
6、代码审查
我曾经听过一些较高级别的技术分享,竟然还不时听到一些呼吁大家要做代码审查的主题。
我以为在这个级别的技术会议上,不应再讨论代码审查有什么好,为什么要做代码审查之类的问题。同时我接触过相当多所谓国内一线互联网公司,竟有许多是不做代码审查的,这一度让我颇为意外。
这里也不想多谈如何做好代码审查,只是就代码质量这点,不客气地说:没有过代码审查的经历往往很难写出高质量的代码,尤其是在各种追求速度的糙快猛创业公司。
7、静态检查
很多代码上的问题,都可以通过一些工具来找到,某些场景下,它比人要靠谱得多,至少不会出现某些细节上的遗漏,同时也能有效帮助大家减少代码审查的工作量。
Android 开发中有 Lint,Find bugs,PMD 等优秀静态检查工具可用,通过改进这些工具找出的问题,就能对语法的细节,规范,编程的技巧有更多直观了解。
建议最好与持续集成(CI),代码审查环境配套使用, 每次提交的代码都能自动验证是否通过了工具的代码检查,通过才允许提交。
8、单元测试
Android 单元测试,一直备受争议,主要还是原生的测试框架不够方便,每跑一次用例需要在模拟器或者真机上运行,效率太低,也不方便在 CI 环境下自动构建单元测试,好在有 Robolectric,能帮我们解决部分问题。
单元测试的一个非常显著的优点是,当你需要修改大量代码时,尽管放心修改,只需要保证单元测试用例通过即可,无需瞻前顾后。
9、充分自测
有一种说法:程序员最害怕的是他自己写的代码,尤其是准备在众人面前 show 自己的工作成果时,因此在写完代码后,需要至少跑一遍基本的场景,一些简单的异常流。
在把你的工作成果提交给测试或用户前,充分自测是基本的职业素养,不要总想着让测试帮你找问题,随便用几下就 Crash 的东西,你好意思拿给别人吗?
10、善用开源
并非开源的东西,质量就高,但至少关注度较高,使用人数较多,口碑较好的开源项目,质量是有一定保证的,这其中的道理很简单。
即便存在一些问题,也可以通过提交反馈,不断改进。最重要的是,你自己花时间造的轮子,需要很多精力维护,而充分利用开源项目,能帮助你节省很多时间,把精力专注在最需要你关心的问题上。
从另一个方面来说,开源项目中的一些知名项目,往往是领域内的翘楚所写,学习这些高手的代码,能让你了解到好的代码应该是怎样的,培养出更灵敏的嗅觉,识别代码中的各种味道
Q2: 北大青鸟java培训:如何才能写出一手高质量优美的代码?
怎么判断代码是否是优质量的代码呢?下面河南电脑培训来简单对代码质量的问题进行一个介绍。
代码质量所涉及的5个方面,编码标准、代码重复、代码覆盖率、依赖项分析、复杂度分析。
我们分别来看一下这5方面:编码标准:一般来说,公司都会有一份编码规范,类命名、包命名、代码风格之类的都会有所要求。
代码重复:顾名思义就是重复的代码,如果代码中有大量的重复代码,就要考虑是否将重复的代码提取出来,封装成一个公共的方法或者组件。
代码覆盖率:测试代码能运行到的代码比率,代码经过了单元测试了吗?是不是每个方法都进行了测试,代码覆盖率是多少?这关系到代码的功能性和稳定性。
依赖项分析:代码依赖关系怎么样?耦合关系怎么样?是否有循环依赖?是否符合高内聚低耦合的原则?复杂度分析:如果代码中嵌套了很多层的ifelse,就会让人很难阅读。
要相信越优秀的代码,越容易读懂。
Q3: 常见代码重构技巧(非常实用)
1_代码重构漫画.jpeg
项目在不断演进过程中java高质量代码的特点,代码不停地在堆砌。如果没有人为代码的质量负责,代码总是会往越来越混乱的方向演进。当混乱到一定程度之后,量变引起质变,项目的维护成本已经高过重新开发一套新代码的成本,想要再去重构,已经没有人能做到了。
造成这样的原因往往有以下几点java高质量代码的特点:
对于此类问题,业界已有有很好的解决思路:通过持续不断的重构将代码中的“坏味道”清除掉。
重构一书的作者Martin Fowler对重构的定义:
根据重构的规模可以大致分为大型重构和小型重构:
大型重构 :对顶层代码设计的重构,包括:系统、模块、代码结构、类与类之间的关系等的重构,重构的手段有:分层、模块化、解耦、抽象可复用组件等等。这类重构的工具就是java高质量代码的特点我们学习过的那些设计思想、原则和模式。这类重构涉及的代码改动会比较多,影响面会比较大,所以难度也较大,耗时会比较长,引入bug的风险也会相对比较大。
小型重构 :对代码细节的重构,主要是针对类、函数、变量等代码级别的重构,比如规范命名和注释、消除超大类或函数、提取重复代码等等。小型重构更多的是使用统一的编码规范。这类重构要修改的地方比较集中,比较简单,可操作性较强,耗时会比较短,引入bug的风险相对来说也会比较小。什么时候重构 新功能开发、修bug或者代码review中出现“代码坏味道”,我们就应该及时进行重构。持续在日常开发中进行小重构,能够降低重构和测试的成本。
2_代码常见问题.png
代码重复
方法过长
过大的类
逻辑分散
严重的情结依恋
数据泥团/基本类型偏执
不合理的继承体系
过多的条件判断
过长的参数列
临时变量过多
令人迷惑的暂时字段
纯数据类
不恰当的命名
过多的注释
3_代码质量如何衡量.jpg
代码质量的评价有很强的主观性,描述代码质量的词汇也有很多,比如可读性、可维护性、灵活、优雅、简洁。这些词汇是从不同的维度去评价代码质量的。其中,可维护性、可读性、可扩展性又是提到最多的、最重要的三个评价标准。
要写出高质量代码,我们就需要掌握一些更加细化、更加能落地的编程方法论,这就包含面向对象设计思想、设计原则、设计模式、编码规范、重构技巧等。
4_SOLID原则.png
一个类只负责完成一个职责或者功能,不要存在多于一种导致类变更的原因。
单一职责原则通过避免设计大而全的类,避免将不相关的功能耦合在一起,来提高类的内聚性。同时,类职责单一,类依赖的和被依赖的其他类也会变少,减少了代码的耦合性,以此来实现代码的高内聚、松耦合。但是,如果拆分得过细,实际上会适得其反,反倒会降低内聚性,也会影响代码的可维护性。
添加一个新的功能,应该是通过在已有代码基础上扩展代码(新增模块、类、方法、属性等),而非修改已有代码(修改模块、类、方法、属性等)的方式来完成。
开闭原则并不是说完全杜绝修改,而是以最小的修改代码的代价来完成新功能的开发。
很多设计原则、设计思想、设计模式,都是以提高代码的扩展性为最终目的的。特别是 23 种经典设计模式,大部分都是为了解决代码的扩展性问题而总结出来的,都是以开闭原则为指导原则的。最常用来提高代码扩展性的方法有:多态、依赖注入、基于接口而非实现编程,以及大部分的设计模式(比如,装饰、策略、模板、职责链、状态)。
子类对象(object of subtype/derived class)能够替换程序(program)中父类对象(object of base/parent class)出现的任何地方,并且保证原来程序的逻辑行为(behavior)不变及正确性不被破坏。
子类可以扩展父类的功能,但不能改变父类原有的功能
调用方不应该依赖它不需要的接口java高质量代码的特点;一个类对另一个类的依赖应该建立在最小的接口上。接口隔离原则提供了一种判断接口的职责是否单一的标准:通过调用者如何使用接口来间接地判定。如果调用者只使用部分接口或接口的部分功能,那接口的设计就不够职责单一。
高层模块不应该依赖低层模块,二者都应该依赖其抽象java高质量代码的特点;抽象不应该依赖细节,细节应该依赖抽象。
一个对象应该对其他对象保持最少的了解
尽量使用合成/聚合的方式,而不是使用继承。
单一职责原则告诉我们实现类要职责单一;里氏替换原则告诉我们不要破坏继承体系;依赖倒置原则告诉我们要面向接口编程;接口隔离原则告诉我们在设计接口的时候要精简单一;迪米特法则告诉我们要降低耦合。而开闭原则是总纲,告诉我们要对扩展开放,对修改关闭。
image.png
模块结构说明
代码开发要遵守各层的规范,并注意层级之间的依赖关系。
多个方法代码重复、方法中代码过长或者方法中的语句不在一个抽象层级。
方法是代码复用的最小粒度,方法过长不利于复用,可读性低,提炼方法往往是重构工作的第一步。
意图导向编程 :把处理某件事的流程和具体做事的实现方式分开。
将函数放进一个单独对象中,如此一来局部变量就变成了对象内的字段。然后你可以在同一个对象中将这个大型函数分解为多个小型函数。
方法参数比较多时,将参数封装为参数对象
任何有返回值的方法,都不应该有副作用
临时变量仅使用一次或者取值逻辑成本很低的情况下
将复杂表达式(或其中一部分)的结果放进一个临时变量,以此变量名称来解释表达式用途
把复杂的条件表达式拆分成多个条件表达式,减少嵌套。嵌套了好几层的if - then-else语句,转换为多个if语句
当出现大量类型检查和判断时,if else(或switch)语句的体积会比较臃肿,这无疑降低了代码的可读性。 另外,if else(或switch)本身就是一个“变化点”,当需要扩展新的类型时,我们不得不追加if else(或switch)语句块,以及相应的逻辑,这无疑降低了程序的可扩展性,也违反了面向对象的开闭原则。
非正常业务状态的处理,使用抛出异常的方式代替返回错误码
某一段代码需要对程序状态做出某种假设,以断言明确表现这种假设。
当使用一个方法返回的对象时,而这个对象可能为空,这个时候需要对这个对象进行操作前,需要进行判空,否则就会报空指针。当这种判断频繁的出现在各处代码之中,就会影响代码的美观程度和可读性,甚至增加Bug的几率。
空引用的问题在Java中无法避免,但可以通过代码编程技巧(引入空对象)来改善这一问题。
根据单一职责原则,一个类应该有明确的责任边界。但在实际工作中,类会不断的扩展。当给某个类添加一项新责任时,你会觉得不值得分离出一个单独的类。于是,随着责任不断增加,这个类包含了大量的数据和函数,逻辑复杂不易理解。
此时你需要考虑将哪些部分分离到一个单独的类中,可以依据高内聚低耦合的原则。如果某些数据和方法总是一起出现,或者某些数据经常同时变化,这就表明它们应该放到一个类中。另一种信号是类的子类化方式:如果你发现子类化只影响类的部分特性,或者类的特性需要以不同方式来子类化,这就意味着你需要分解原来的类。
继承使实现代码重用的有力手段,但这并非总是完成这项工作的最佳工具,使用不当会导致软件变得很脆弱。与方法调用不同的是,继承打破了封装性。子类依赖于其父类中特定功能的实现细节,如果父类的实现随着发行版本的不同而变化,子类可能会遭到破坏,即使他的代码完全没有改变。
举例说明,假设有一个程序使用HashSet,为了调优该程序的性能,需要统计HashSet自从它创建以来添加了多少个元素。为了提供该功能,我们编写一个HashSet的变体。
通过在新的类中增加一个私有域,它引用现有类的一个实例,这种设计被称为组合,因为现有的类变成了新类的一个组件。这样得到的类将会非常稳固,它不依赖现有类的实现细节。即使现有的类添加了新的方法,也不会影响新的类。许多设计模式使用就是这种套路,比如代理模式、装饰者模式
继承与组合如何取舍
Java提供了两种机制,可以用来定义允许多个实现的类型:接口和抽象类。自从Java8为接口增加缺省方法(default method),这两种机制都允许为实例方法提供实现。主要区别在于,为了实现由抽象类定义的类型,类必须称为抽象类的一个子类。因为Java只允许单继承,所以用抽象类作为类型定义受到了限制。
接口相比于抽象类的优势:
接口虽然提供了缺省方法,但接口仍有有以下局限性:
接口缺省方法的设计目的和优势在于:
为了接口的演化
可以减少第三方工具类的创建
可以避免创建基类
由于接口的局限性和设计目的的不同,接口并不能完全替换抽象类。但是通过对接口提供一个抽象的骨架实现类,可以把接口和抽象类的优点结合起来。 接口负责定义类型,或许还提供一些缺省方法,而骨架实现类则负责实现除基本类型接口方法之外,剩下的非基本类型接口方法。扩展骨架实现占了实现接口之外的大部分工作。这就是模板方法(Template Method)设计模式。
Image [5].png
接口Protocol:定义了RPC协议层两个主要的方法,export暴露服务和refer引用服务
抽象类AbstractProtocol:封装了暴露服务之后的Exporter和引用服务之后的Invoker实例,并实现了服务销毁的逻辑
具体实现类XxxProtocol:实现export暴露服务和refer引用服务具体逻辑
由于为了保持Java代码的兼容性,支持和原生态类型转换,并使用擦除机制实现的泛型。但是使用原生态类型就会失去泛型的优势,会受到编译器警告。
每一条警告都表示可能在运行时抛出ClassCastException异常。要尽最大的努力去消除这些警告。如果无法消除但是可以证明引起警告的代码是安全的,就可以在尽可能小的范围中,使用@SuppressWarnings("unchecked")注解来禁止警告,但是要把禁止的原因记录下来。
参数化类型不支持协变的,即对于任何两个不同的类型Type1和Type2而言,List既不是List的子类型,也不是它的超类。为了解决这个问题,提高灵活性,Java提供了一种特殊的参数化类型,称作有限制的通配符类型,即List? extends E和List? super E。使用原则是producer-extends,consumer-super(PECS)。如果即是生产者,又是消费者,就没有必要使用通配符了。
还有一种特殊的无限制通配符List?,表示某种类型但不确定。常用作泛型的引用,不可向其添加除Null以外的任何对象。
嵌套类(nested class)是指定义在另一个类的内部的类。 嵌套类存在的目的只是为了它的外部类提供服务,如果其他的环境也会用到的话,应该成为一个顶层类(top-level class)。 嵌套类有四种:静态成员类(static member class)、非静态成员类(nonstatic member class)、匿名类(anonymous class)和 局部类(local class)。除了第一种之外,其他三种都称为内部类(inner class)。
总而言之,这四种嵌套类都有自己的用途。假设这个嵌套类属于一个方法的内部,如果只需要在一个地方创建实例,并且已经有了一个预置的类型可以说明这个类的特征,就要把它做成匿名类。如果一个嵌套类需要在单个方法之外仍然可见,或者它太长了,不适合放在方法内部,就应该使用成员类。如果成员类的每个实例都需要一个指向其外围实例的引用,就要把成员类做成非静态的,否则就做成静态的。
通过对常见场景的代码逻辑进行抽象封装,形成相应的模板工具类,可以大大减少重复代码,专注于业务逻辑,提高代码质量。
面向对象编程相对于面向过程,多了实例化这一步,而对象的创建必须要指定具体类型。我们常见的做法是“哪里用到,就在哪里创建”,使用实例和创建实例的是同一段代码。这似乎使代码更具有可读性,但是某些情况下造成了不必要的耦合。
对于顶层的(非嵌套的)类和接口,只有两种的访问级别:包级私有的(没有public修饰)和公有的(public修饰)。
对于成员(实例/域、方法、嵌套类和嵌套接口)由四种的访问级别,可访问性如下递增:
正确地使用这些修饰符对于实现信息隐藏是非常关键的,原则就是:尽可能地使每个类和成员不被外界访问(私有或包级私有)。这样好处就是在以后的发行版本中,可以对它进行修改、替换或者删除,而无须担心会影响现有的客户端程序。
不可变类是指其实例不能被修改的类。每个实例中包含的所有信息都必须在创建该实例时提供,并在对象的整个生命周期内固定不变。不可变类好处就是简单易用、线程安全、可自由共享而不容易出错。Java平台类库中包含许多不可变的类,比如String、基本类型包装类、BigDecimal等。
为了使类成为不可变,要遵循下面五条规则:
可变性最小化的一些建议:
TDD的最终目标是整洁可用的代码(clean code that works)。大多数的开发者大部分时间无法得到整洁可用的代码。办法是分而治之。首先解决目标中的“可用”问题,然后再解决“代码的整洁”问题。这与体系结构驱动(architecture-driven)的开发相反。
采用TDD另一个好处就是让我们拥有一套伴随代码产生的详尽的自动化测试集。将来无论出于任何原因(需求、重构、性能改进)需要对代码进行维护时,在这套测试集的驱动下工作,我们代码将会一直是健壮的。
Image [6].png
添加一个测试 - 运行所有测试并检查测试结果 - 编写代码以通过测试 - 运行所有测试且全部通过 - 重构代码,以消除重复设计,优化设计结构
作者:VectorJin
Q4: 北大青鸟设计培训:学Java怎么写出高质量的代码?
学一门编程语言是进入IT行业的法宝,很多人在明确了自己的兴趣,明确了自己未来想从事的领域,明确了自己未来想成为一个什么样的程序员后,选择了学Java。
不管学哪门编程语言,一定是要学会敲代码的,这是你不可逃避的。
学Java,怎么写出高质量的Java代码?java课程认为这就是你得高度集中精力关心的问题。
怎么写出高质量的Java代码?1、坚持没有谁能够随随便便就成功,也没有谁能够随随便便敲一手高质量的Java代码,就算你现在看着别人敲代码怎么那么轻松,他们的轻松来源于坚持多次的练习,你要是想让自己的Java代码变得高质量,那么就离不开你长久的坚持,只有投入足够多的时间,做出足够的练习,你才能够获得质的飞跃。
2.专业Java专业知识是基本,好比盖楼,地基不稳,怎么也盖不出参天大楼。
Java代码的敲写,很多的时候,也是一样的,你连最基础的Java理论知识都没有掌握好,然后就想跑在其他人的前面,敲出高质量的Java代码,那么简直就是做梦。
起初,Java专业知识学起来是比较枯燥的,但是你必须要好好的去研究跟掌握。
3.模仿你是怎么开始进入Java代码的敲写的,很多朋友回想一下,你是不是从模仿开始的,仿照其他人已经写好的代码跟着写一遍,写两遍,甚至是写三遍。
模仿很重要,同时思考也很重要,熟练来源于练习,做好和作对源于不断的实践,你要想敲出高质量的Java代码,那么你一定得好好研究怎么样模仿的效果最好。
Q5: 怎样编写高质量的Java代码
如何编写高质量代码,从而提升系统性能。想必是很多程序员都非常注意的地方,最近总结了一些要点,特此记录在案。 所谓代码高可读性和高可维护性,其实就是应该有着规范的Java程序设计风格,在开发程序过程中,从近期目标看是应该着眼于功能实现,但是只能解一时之渴,而不思长远之计,确不可取,一个杂乱无序的代码让人看后有一种不解其意,心绪烦乱的感觉。所以,作为一名合格的程序员,一定要确定一个观点就是你编写出来的代码不只是给你一个人看的,还是给别人看的,所以在开发过程中文件注释头,java源文件编排格式,方法体的具体业务含义的注释都是必须的。 如程序注释就分为块注释与行注释 。例如块注释为
/**
* @param
@return
*/
行注释
/** **/或者 //
再者就是方法的命名也需要多加斟酌,一个业务方法,如果取最能体现体现该业务的名字,这样读者几乎不需要看代码便可以知道该方法具体用途。 高质量的代码其实很多时候都在一些小细节中体现,对于每个程序员来说一个for循环都会写,可是却有很多人没有能在代码中体现出高效性来,在这里我用简单的一个例子来说明:一个ArrayList需要遍历。 一般人会写成for(int i=0;ilist.size();i++) 这有问题吗?没有问题,能够完成程序员的意图的功能。
可是它高效吗?你有注意到这点吗?其实问题就出现在list.size()方法,这个方法是计算一个list的大小,本身它不会存在任何问题,可是将它放在了一个for()循环中的话,就很有问题了,因为如果一个N次的for循环,这个方法就需要被执行N次,这样的代码就造成计算机花很多的时间去做没有意义的事情,而本来这个list.size()方法只需要计算一次的就可以了,所以我们把计算list大小的方法放在for循环外面去定义的话,效率就可以得到提高
如: int size = list.size();
for(int i=0;isize;i++)
关于For循环还有一个要注意的地方,就是在for循环里面去New一个新对象。如:
for(int i=0;i10;i++){
A a = new A();
}
是不是怎么看都不会有问题,是的在语法上。或者是执行业务处理逻辑的时候,它都是没有任何问题的,可是这是从语言级别去看待问题,没有深入到它的实现机制上去看待问题。
在介绍这个问题的之前我想先简单说下关于java内存的机制:java是如何在内存中保存对象,我们回到A a=new A()在内存中是怎么分配这个问题来,
首先在栈中开辟一段空间存放引用a,然后在堆中开辟一段空间存放新建的A对象,同时引用a指向堆中新建得A对象,a所指代的对象地址为A在堆中地址。根据javaGC机制,只有对象已经没有引用指向它的时候,才有可能被GC给回收,所以基于这种机制的话,上述的一个For循环就会存在很大的效率问题了,如果循环有1000次,在内存中栈会有1000个引用,而堆中也会有1000个新生成的对象,同时1000个引用会相应指向1000个新生成的对象,即使这个for循环结束,也不会有任何改变。但是实际上1000个引用的生成完全是没有必要的,如果有着编写高性能代码的想法的话:像这样的for循环完全可以这样写:
A a = null;
for(int i=0;i1000;i++){
a = new A();
...
}
这样的代码在内存中便只会在栈中生成一个指向,每当一个for循环结束后,这个指向会指向下一个新生成的对象,前面生成的对象就会失去指向,这样GC就有可能更加快速的回收这些已经失去功能的对象。 在java中其实new 一个对象是非常耗费时间的,特别是重量级对象,所以每次在new 对象的时候一定需要考虑清楚是不是非的生成一个对象才能完成我的业务需求呢?总之能够根据实际情况,然后举一反三的话,我相信大家编写出来的代码就会更加高效了。
其次是针对同步的慎重考虑,因为我们一旦用了synchronized这个关键字后,就很可能丧失了并行的功效,所以在开发的过程中需要注意到线程是不是会对共有的资源进行处理,然后在慎重选择Synchronized 关键字,其实大家可以考虑用ThreadLocal这个类,它的优点是既保证同步的情况下仍然能保证并行,缺点是会占用更多的空间去换取换取时间。
最后,便是在j2ee开发过程中对数据库操作的优化,在这里我只针对代码级别的优化,关于数据库级别的我不涉及。大家编写SQL的时候会不会注意到一些原则,在这里我将罗列一些需要注意的要点。(总结肯定不会很全,我希望如果有大虾能给予更多的经验指导,在下将会感激万分。)
(1)在搜索子句的列名边要避免函数、算术操作符和其它的表达式,除非建立基于函数的索引
(2)使用复合索引的第一个列名
(3)SELECT子句中避免使用 ‘*’
(4)如果可能尽量多用"Commit"
(5)避免在索引列上使用IS null和Is not null
(6)用Union -all替换Union(如果可能的话)
(7)Oracel 采用自下而上的顺序解析WHERE子句,可以过滤掉最大数量记录的条件写在WHERE子句的末尾
(8)between谓词可以转化为=and=子句,比如:price between 10 and 20
可以转化为 price= 10 and =20
(9)like子句中匹配值的第一个字符是常量,也可以进行转换, 例如:
like “sm%”可以转换成 =“sm” and “sn”
(10)在子查询,exists和in要比not exists和not in执行得快,因为对于exists和in,优化器只要找到一条记录就可以返回TRUE,而对于not exists和not in则必须检查所有的值。
以上10条总结如果在编写sql的时候能注意到的话,将会在一定程度上提高java跟数据交互的性能。
那么除了在SQL上下功夫来提高性能之外,编写合适的事务处理也将带来一些性能提高。我们都知道事务具有:原子性,隔离性,一致性,持久性,所以在使用事务的时候肯定是牺牲并发性能为代价的。特别是一个涉及update的事务处理的时候,数据库会在表上加上排他锁,而一个数据资源只要被一个事务放置了排他锁,其他事务将不能放上排他锁,一定要一直等到事务结束后才释放。所以在这种情况下的,并发性就会被抹杀掉了。我们不能改变这种加锁的机制,但是我们可以用另外一种方式来达到一定程度的性能提升,那就是根据实际情况将一个大事务分解成小事务来处理。简而言之就是减低事务放置排他锁和释放排他锁的时间间隔,这样可以让其他的事务能更快的访问到数据资源。而关于大事务分解一定要小心使用,如果使用不恰当的话很可能会产生意想不到的数据不一致错误。
java高质量代码的特点的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java高质量代码的特点是什么、java高质量代码的特点的信息别忘了在本站进行查找喔。







