`
aaronjiu_00
  • 浏览: 69181 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

编码最佳实践系列之一

阅读更多
  • 避免空指针:
    /**
      * 判断应用是否有月租
      *
      * @param onlineProfile
      * @return 有月租返回true,无月租返回false
      */
    private boolean isAppHasRent(AppOnlineProfile onlineProfile) {
        return onlineProfile == null ? false : "y".equals(onlineProfile.getHasRent());
    }
    
     
  • 集合List转换为数组[]
    /**
      * 从应用订购列表中获得用户Id数组
      *
      * @param appSubscList 应用订购列表
      * @return 返回用户Id数组
      */
    private String[] getUserIds(final List<AppSubsc> appSubscList) {
        List<String> resultList = new ArrayList<String>(appSubscList.size());
        for (AppSubsc appSubsc : appSubscList) {
            resultList.add(appSubsc.getUser().getUserId());
        }
        return resultList.toArray(new String[resultList.size()]);
    }
     
  • 枚举的遍历
    /**
      * 更改应用订购列表里面每个订单的订购者的LongId,其中LongId去除域名前缀
      *
      * @param appSubscList 应用订购列表
      * @return 返回更改LongId后的应用订购列表
      */
    private List<AppSubsc> setLongIds(final List<AppSubsc> appSubscList) {
        List<AppSubsc> resultList = new ArrayList<AppSubsc>(appSubscList);
        UserIdentifier[] userIdentifiers = userService.getUserIdentifiers(getUserIds(appSubscList));
        if (userIdentifiers != null) {
            for (int i = 0; i < userIdentifiers.length; i++) {
                final String longId = userIdentifiers[i].getLongId();
                for (DomainPrefix domainPrefix : DomainPrefix.values()) {
                    if (longId.startsWith(domainPrefix.name())){
                        resultList.get(i).getUser().setLongId(longId.substring(domainPrefix.name().length()));
                        break;
                    }
                }
            }
        }
        return resultList;
    }
    
     
  • 方法的重载,HowToDo? 
    首先,选中类中需要重载的方法,(如果选中的方法是接口声明中方法实现的话,会出现询问框,选择Yes), 然后通过菜单栏"Refactor -> Change Method Signature ...",
    或者上下文菜单"Refactor -> Change Method Signature ...",或者快捷键"Alt + Shift + C",将会弹出"Change Method Signature"对话框,
    在"参数"选项卡(默认会出现),单击右侧的"Add"按钮,添加一个参数,例如可以添加一个字符串参数:Type为String,Name为corpId,默认值为null
    (如果Type是数值,可以是0或者任何能表示空概念的值),注意勾选复选框"Kepp original method as delegate to change method", 点击"Preview"按钮预览结果,
    或者直接点击"OK",直到完成重构。

    请大家关注重构后的结果,可以注意到接口里面也自动添加了方法签名,而且原来接口声明中的方法实现都会委托给这个新建的方法中,大家想想这样做有什么好处?

    当然你也可以通过编码@Deprecated原来的方法,或者在先前的"Change Method Signature"对话框中,勾选复选框"Marks as deprecated";
    如果将来不在需要这个@Deprecated的方法时,可以将原来的方法"Inline"掉
      
  • 断言的使用(基于org.springframework.util.Assert)
    Assert.notNull(appSubsc, "appSubsc must not be null"); Assert.notNull(appSubsc.getUser(), "appSubsc.user must not be null");
    
    Assert.notNull(appSubsc.getUser().getUserId(), "appSubsc.user.userId must not be null");
    Assert.notNull(appSubsc.getUser().getName(), "appSubsc.user.name must not be null");
    
    Assert.notNull(appSubsc.getApp(), "appSubsc.app must not be null");
    Assert.notNull(appSubsc.getApp().getId(), "appSubsc.app.appId must not be null");
    Assert.notNull(appSubsc.getApp().getIsvId(), "appSubsc.app.isvId must not be null");
    
    Assert.hasText(appSubsc.getAppInstanceId(), "appSubsc.appInstanceId must not be empty");
    
     
  • 先写类,还是先写接口?
    我想很多同学都是在先写接口,然后再写这个接口的实现类,这是几乎所有人的做法。

    我的思路很特别,我先写类,然后再通过重构这门"艺术",如果有需要才"提取"为"接口",如何提取接口?

    首先,选中类名,通过菜单栏"Refactor -> Extract interface...",或者上下文菜单"Refactor -> Extract interface...",打开"Extract interface"对话框,
    先不用关注提取接口存放的位置(将来可以"Move"到恰当的位置,),直接输入"Interface name"(不用输入包名),点击"Preview"按钮,或者点击"OK"按钮完成接口的提取。

    如果有需求在已有接口中新增几个方法,或者要新增的方法已经在实现类中存在,怎么办?难道要手工在接口代码中添加方法,然后再实现这些接口声明吗,事实上大部分同学是这么做的。

    我则不然!我可以利用我们的利器"Eclipse IDE",我还是从【实现】类开始,新增方法,你就直接编写新的方法好了,如果已经存在了,就不必写了。
    然后在接口的实现类中,选中想要作为接口暴露的方法,通过菜单栏"Refactor -> Pull up...",或者上下文菜单"Refactor -> Pull up...",弹出"Pull Up"对话框,
    选择"destination type"和"members to pull up",把这个方法提升为接口中的方法,具体可以看我的现场演示,请大家大胆使用重构这门"艺术",会给大家带来"快感"
     
     
分享到:
评论
1 楼 steven0lisa 2012-04-09  
最后一点确实很有艺术,学习了~~~

相关推荐

    C_C_和Java安全编码实践提示与技巧,C_C_和Java安全编码实践提示与技巧

    - **遵循最佳实践**:了解并遵循安全编码的最佳实践指南,如OWASP Top Ten等。 - **持续教育**:软件安全是一个不断发展的领域,保持学习最新的威胁和技术至关重要。 总之,通过采用合适的编码实践和技术手段,可以...

    iOS开发最佳实践

    以下是从不同维度总结出的一系列iOS开发最佳实践。 #### 最佳学习方法实践 - **选择合适的书籍:** 在学习之初,挑选适合自己的书籍至关重要。建议从基础入手,逐步过渡到高级主题。例如,《iOS Programming: The ...

    Java编码规范及实践

    “编程实践”章节涵盖了更高级的编程技巧和最佳实践,如: - 如何正确地处理异常。 - 使用集合时的最佳做法。 - 避免内存泄漏的方法。 这些实践可以帮助开发者写出更加健壮和高效的代码。 #### 六、设计模式快速...

    13246857451.zip_BD precoding_MIMO预编码svd_SVD 预编码_多用户MIMO检测_预编码 检测

    预编码是MIMO系统中的关键技术之一,它通过在发射端对信号进行处理,以改善系统性能并降低干扰。在这个"13246857451.zip_BD precoding_MIMO预编码svd_SVD 预编码_多用户MIMO检测_预编码 检测"的压缩包中,包含的是...

    cpp-CCore指南是关于C编码的一套可靠准则规则和最佳实践

    《C++ Core Guidelines》是一本由Bjarne Stroustrup(C++之父)和 Herb Sutter等专家共同编写的指南,旨在为C++开发者提供一套权威的编码规范和最佳实践。这本书涵盖了一系列主题,旨在帮助程序员编写更安全、更高效...

    机械行业编码 参照

    在机械行业中,虽然没有强制性的统一标准,但参考行业最佳实践是明智之举。 10. **实例分析**:“04 机械行业编码”文件可能包含了不同类型的物料编码实例,通过学习这些案例,可以深入理解如何将上述理论应用到...

    移动端开发最佳实践

    本文档旨在分享一系列移动端APP开发的最佳实践,涵盖从设计到编码的全过程,帮助开发者构建高性能、高兼容性的移动Web应用。 ### 移动设备的演化与挑战 自1999年万维网(World Wide Web,简称WWW)的普及,到2005...

    php开发最佳实践_pdf文档

    - **Git**:目前最流行的版本控制系统之一,提供了强大的分支管理和合并功能。 - **工作流**:采用合适的Git工作流(如Git Flow或Forking Workflow),可以更好地组织项目开发过程。 - **备份策略**:确保代码库的...

    Python技术使用最佳实践总结.docx

    为了帮助开发者编写出更高质量的Python代码,本文将深入探讨一系列Python技术的最佳实践。这些实践不仅有助于提高代码的可读性和可维护性,还能显著提升程序的性能。 #### 二、良好的代码组织结构 1. **模块化设计...

    Ajax模式与最佳实践(英文清晰版)

    Ajax作为Web 2.0的核心技术之一,其核心优势在于它能够实现更高效的客户端与服务器交互,使Web应用具有桌面应用的特性,如实时交互和更好的用户体验。 #### 三、Ajax与REST结合 **1. REST简介** REST...

    eclipse-编码规范系列(一):Eclipse Code Templates设置 - CSDN博客1

    Eclipse是一款广泛使用的Java集成开发环境,其强大的功能之一就是能够根据个人或团队的编码规范进行自定义设置。本文将详细介绍如何在Eclipse中设置Code Templates,以实现代码的自动格式化和一致性。 编码规范是...

    业务安全与+DevSecOps+的最佳实践y240221.pptx

    它强调将安全性作为每个团队成员的工作职责之一,并将其集成到共享源代码库及部署管道中。这种方法可以有效地减少安全漏洞,提高软件的质量和可靠性。 - **DevSecOps的发展历程**: - 2012年,Gartner首次提出...

    安全开发之Java Web安全编码.pdf

    - **安全编码的重要性**:安全编码是指在软件开发过程中,开发者通过遵循一系列最佳实践来确保所编写的代码不会引入安全漏洞。安全编码的重要性在于它可以有效地降低后期修复漏洞的成本。在需求和架构阶段解决安全...

    arcgis属性表利用python自动编码.zip

    7. **最佳实践**:文档可能还会涵盖编写高效、可维护的Python脚本的一些最佳实践,比如代码注释、模块化编程以及使用版本控制工具如Git等。 通过学习和应用这个压缩包中的方法,你可以提高在ArcGIS中进行数据管理的...

    Java安全编码培训.pdf

    加密算法是保护数据传输和存储安全的关键技术之一,培训中可能会包含如何在Java程序中正确使用加密算法。例如,使用Java加密库(JCE)对敏感数据进行加密和解密操作。 I/O操作涉及数据的输入和输出,培训可能会讲解...

    密码编码学与网络—原理与实践(第5版)

    许多大学将其作为信息安全课程的标准教材之一。 #### 八、其他相关书籍推荐 除了《密码编码学与网络安全——原理与实践》外,作者威廉姆·斯托林斯还著有多部关于计算机网络和信息安全的经典教材,如: - **...

    深入掌握Python中的条件语句:用法、技巧与最佳实践

    其中,条件语句是实现程序逻辑控制的基础之一,它允许根据不同的条件执行不同的代码路径。本文旨在全面解析Python中的条件语句,包括`if`、`elif`和`else`的使用方法、技巧以及最佳实践,帮助读者深入理解和掌握这一...

Global site tag (gtag.js) - Google Analytics