阅读更多

0顶
0踩

编程语言
“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 替代。

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

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

原文:Effective Java for Android (cheatsheet)
译者:Tocy, 边城
  • 大小: 12 KB
  • 大小: 13.2 KB
  • 大小: 90.1 KB
  • 大小: 53.4 KB
  • 大小: 8.8 KB
  • 大小: 53.3 KB
  • 大小: 11.2 KB
  • 大小: 72.7 KB
  • 大小: 13.3 KB
  • 大小: 43.1 KB
  • 大小: 16.8 KB
来自: 开源中国
0
0
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • BCB中无标题栏可拖动的窗口的四种方法

    方法一,用消息接收的方法。 方法二,重载WndProc函数。 方法三,同样也是重载WndProc函数。 只是在实现函数的代码中,用了比较巧妙的方法。 方法四,用鼠标事件来实现。

  • BCB窗体移动

    窗体上放置一Image,响应MouseDown事件。void __fastcall TForm1::Image1MouseDown(TObject *Sender,       TMouseButton Button, TShiftState Shift, int X, int Y) {   ReleaseCapture();   Perform(WM_SYSCOMMAND,0xf012,0);

  • C++ Builder中实现拖放功能

    在C++ Builder中实现拖放功能关键字:实现拖放功能,DockSite,DragKind,DragModeWindows中的拖放功能大家一定很熟悉了,如文件的移动,拷贝等操作用鼠标轻轻一拖即可,在编写程序中有时也用到拖放,那么如何实现呢?现以C++ Builder5(简称CB5)为例,分析拖放功能的具体实现。一.工具条的拖放—- 要实现拖放功能,首先必须了解几个与拖放有关的属性和方法, 对于T

  • BCB窗口任意拖动

    void __fastcall TForm1::Image1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { iX = X; iY = Y; bMouseDown = true; } //------------------------...

  • C++ Builder 初学问与答(八) (转)

    C++ Builder 初学问与答(八) (转)[@more@](版权声明:本系列文章仅供CSDN使用,另授权CCRUN转载,其他个人与网站未经作者或CSDN同意不得转载、摘抄) 8.图形类组件 59)问:wind...

  • c++builder如何通过鼠标拖动改变无边框窗体的大小(bsnone)

    转自http://www.ccrun.com/article.asp?i=990&d=70jx1b 在C++Builder中,将Form的BorderStyle设为bsNone以后该窗体将没有边框,不能改变窗体大小,也不能拖动窗体。那么如何拖动及用鼠标改变无边框窗体大小呢?拖动无边框窗体的解决方法很多,例如: 1. 向窗体发送WM_NCLBUTTONDOWN消息,LParam = HTCAPT

  • 实现控件的移动、改变大小(DELPHI实现)

     实现控件的移动,改变大小(DELPHI实现)主要使用Perform方法  function Perform(Msg: Cardinal; WParam, LParam: Longint): Longint;  只要能够使用类似于win32API的函数SendMessage(),本方法同样可在其他环境里应用。用Delphi实现首先,建立一个应用程序,在一个窗体里加入一个Panel1,保

  • Rectangle 属性

    Rectangle 类 绘制一个矩形形状,该形状可以具有笔画和填充。 命名空间: System.Windows.Shapes程序集: System.Windows(在 System.Windows.dll 中) Rectangle 属性 Rectangle 类型公开以下成员。 属性 名称 说明 ...

  • 实现控件的移动功能

    using   System; using   System.Collections.Generic; using   System.Text; using   System.Windows.Forms; using   System.Drawing; namespace   EastTicket.CustotmCol {         class   MovePane

  • bcb控件拖放

    转自:http://hi.baidu.com/luoshupeng/blog/item/a27f3429c571b9f999250a88.html 控件分为两种:有Handle的和无Handle的。 一、对于有Handle的控件,如Button,Edit类可以使用如下方法: 在控件的MouseMove事件中写入: WORD SC_DragMove = oxF012; ReleaseCap

Global site tag (gtag.js) - Google Analytics