适用于Android开发的Effective Java

“Effective Java” 被许多人看做是编写高效且可维护的 Java 代码的重要指导书之一。Android 使用 Java 开发是否意味着里面的建议都要用上?不完全是。 有些人认为这本书给出的大多数建议不适用于 Android 开发。在我看来,情况并非如此。

我认为这本书的一些部分是不适用,不管是因为不是所有 Java 功能都已优化到能与 Android 一起使用(例如枚举、序列化等),还是因为是移动设备的限制例如 Dalvik/ART 表现不同于桌面版的 JVM)。 但不管怎样,本书中的大多数范式还是可以在稍作修改后或直接使用,从而构建一个更健康、更简洁和更易维护的代码库。

这篇博客整合了我在开发 Android 应用时,从 Effective Java 中学习到的重要内容。对于那些读过这本书的人,这篇文章就当是重新回顾一下,对于那些(还)没有阅读它的人,可以把这篇文章当作试读。

强制非实例化(non-instantiability)

如果你不想使用 new 关键字来创建对象,强制它使用私有构造函数。 这对那些仅包含静态函数的工具类尤其有用。

静态工厂

用静态工厂方法 (同时私有化构造器) 代替使用 new 和构造函数。这些工厂方法有自己的名称,不需要每次都返回一个对象的新实例,还可以根据需要返回不同的子对象。

[更新] 我们的读者 @stsdema28 提供了一个有用的提示:静态工厂方法会造成测试困难。如果遇到这种问题,需要使用在测试中使用可模拟的非静态工厂(或者一个可实现的假接口)。

构建器(Builder)

如果你的对象需要超过 3 个构造参数,那就使用构建器来构造对象。这写起来可能有点繁琐,但它扩展性良好而且容易看明白。如果你要创建值类,可以考虑 AutoValue。

避免易变性

不可变对象在它的整个生命周期都保持不变。这类对象所需要的数据都是在它创建的时候提供给它的。使用不可变对象有一些优点,比如简单、线程安全以及可共享。

保持每个类都不可有点困难。确有必要的情况下只能尽量保持类不可变(比如使用 private final 字段和 private class)。在移动端创建对象开销很大,所以注意不要过度创建。

静态成员类

如果你定义了一个不依赖于外部类的内部类,千万别忘了把它定义成静态的。如果不这样做,会导致每个内部类的实例都持有外部类的引用。

随处可见的泛型

Java 提供了类型安全支持。尽量避免使用原始类型或对象类型。在大多数情况下,泛型提供了编译时让代码类型安全的机制。

别忘了你可以在方法的参数和返回值中使用泛型:

为获得更佳的灵活性,你可以使用有界通配符(bounded wildcards)来扩展可接受类型的范围。

返回空值

当必须返回空的 list/collection 时避免使用 null。返回空的集合会使接口变简单(不需要为空返回的函数写文档或注释)并可以避免随机的 NPE。建议返回同一个空集合而不是重新创建一个。

不要使用 + String 操作

要连接几个字符串时,+ 操作也许可行。但不要将其用于大量字符串的连接,这样性能很糟糕。建议用 StringBuilder 替代。

可恢复的异常

我不赞成抛出指示错误的异常,但如果你这样做了,请确保异常可受检查且可恢复:

结论

这个列表并没有罗列书中的所有建议,也不是对书中某个建议的深度解析,而仅仅是对部分有用建议的摘录而已。

本文作者:佚名

来源:51CTO

时间: 2024-08-06 04:41:57

适用于Android开发的Effective Java的相关文章

Android 中的 Effective Java(速查表)

本文讲的是Android 中的 Effective Java(速查表), Effective Java 是一本被广泛认可的著作,它指明了在写 Java 代码时兼顾可维护性与效率的方式.Android 也是使用 Java 来开发的,这意味着前书中的所有建议仍旧可用,真的是这样吗?并不尽然.某些同学 认为书中的"大部分"建议都不适用于 Android 开发,但我认为并不是这样.我承认书中的部分建议确实不适用,因为并非所有 Java 特性都有针对 Android 优化(比如说枚举,序列化等等

适用于Android开发的简单聊天软件_Android

适用于android 开发.是一个简单的聊天软件,包括知识点,各个控件的运用(ExpandableListView,ViewPager,Spinner,LinearLayout,RelativeLayot),自定义的ViaImageView(自定义xml属性),sql 的写入,读取等操作. 1. ViaImageView.java    package com.farina.farinaimagelib; import android.content.Context; import androi

适用于Android开发的简单聊天软件

适用于android 开发.是一个简单的聊天软件,包括知识点,各个控件的运用(ExpandableListView,ViewPager,Spinner,LinearLayout,RelativeLayot),自定义的ViaImageView(自定义xml属性),sql 的写入,读取等操作. 1. ViaImageView.java package com.farina.farinaimagelib; import android.content.Context; import android.c

android-关于Android开发是用Java开发好还是用html5好

问题描述 关于Android开发是用Java开发好还是用html5好 最近html5比较火,请问使用Java开发Android方便还是用html5方便?用html5开发有什么优势 解决方案 html5的优势:跨平台,免用户安装升级,开发也简单原生应用的优势:更底层,可以写服务驻留手机,做一些定时推送之类的操作:可以使用更多本地数据和硬件:效率更高 解决方案二: 没可比性,如果是一些广告页之类的,变动比较频繁,交互不多的可以考虑网页 解决方案三: 用网页,就是一套系统可以运行在各种系统中,好维护,

在Android开发中使用java代码的一些问题,求大神来看看。

问题描述 在Android开发中使用java代码的一些问题,求大神来看看. 1.我在MainActivity中定义一个单击事件监听器OnClickListener,这时要导入类,但是import android.view.*; 这样自己定义的OnClickListener会报错.但是 import android.view.View.*和import android.view.View.OnClickListener均不会报错.请问这是怎么回事?import android.view.*不是代表

android开发是基于java的

问题描述 android开发是基于java的 android开发是基于java的 那么要认识多少个jdk自带的方法和类 有些方法见名字就知道其含义,类也是有些见到名字也知道其含义 解决方案 很多知识都是用的时候才去学的.不一定非得认识多少.多练习,学习无止境. 解决方案二: Android开发小问题--java使用 解决方案三: Android和Java的区别: 简单地说,一种是操作系统,一种是开发语言.具体来说,Android是一种基于Linux的开放源码操作系统,主要用于便携设备(智能手机,

Android开发中R.java文件丢失或无法更新的解决方法

本文分析了Android开发中R.java文件丢失或无法更新的解决方法.分享给大家供大家参考,具体如下: 首先确定你的SDK是新的. 其次接下来检查你的.xml文件,文件名不能大写. 如果xml文件太多 ,那么clean一下你的项目,这时候注意看Console的提示. Console会提示你xml文件错误在哪里 修改完xml文件之后 clean你的项目,再build你的项目 R.java会重新出现或更新 Android 在开发中会自动生成一个 R.java 文件 ,这个文件是自动生成的,最好不要

android开发中的java内存泄露分析

做了较长时间的android开发了,发现其实android应用开发入门容易,但是进阶或者成为高级工程师,需要具备的基础能力还是非常高的:性能优化.内存泄露.apk瘦身.热修复等等,这些都非常的考验一个人的能力.android成长之路还很长,自己会持续的走下去.本文主要介绍android内存泄露方面的知识.其实要真的理解内存泄露,需要对JVM.java语言有一定的了解,在这个基础上就比较容易理解本文了. 一.内存泄露概念 在java中,如果一个对象没有可用价值了,但又被其他引用所指向,那么这个对象

java android开发-新人求教java android. idea

问题描述 新人求教java android. idea 像这类页内链接要怎么做,刚用CSDN没有钱....开发-新人求教java android. idea-ideapocket新人"> 解决方案 http://jingyan.baidu.com/article/39810a23d234b2b636fda602.html