编写java程序151条建议读书笔记(20)

2023-11-06

建议139:大胆采用开源工具

MVC框架有Structs,也有Spring MVC、WebWorker;IoC容器有Spring,也有Coolgle Guice;ORM有Hibernate、MyBatis;日志有经典的log4j、崭新的logback。选择开源工具和框架时要遵循一定的规则:

1、普适性原则:不能有太大的跨度或跳跃性。2、唯一性原则:相同工具选一种,不要让多种相同或功能相似工具共存。3、“大树纳凉”原则:(有名的开源组织)4、精而专原则:精而准不是广泛的。5、高热度原则。

建议140:推荐使用Guava扩展工具包

Guava(石榴)是Google发布的,对JDK的Collection包进行扩展。其中包含了collections、caching、primitives support、concurrency libraries、common annotations、I/O等:

1、Collection:com.goolgle.common.collect包括不可变集合(Immutable Collections)、多值Map、table表和集合工具类。不可变集合包括ImmutableList、ImmutableMap、ImmutableSet、ImmutableSortMap、ImmutableSortedSet等比不可修改集合更容易实现。多值Map。Map是键值对形式。put时如果键重复了则会覆盖原有的值,但一键多值就比较麻烦。使用Guava的Multimap可以解决。集合工具类:Lists、Maps、Sets分别对应List、Map、Set工具类。

2、字符串操作:Guava提供的字符串工具类:Joiner连接器和Splitter拆分器。当然JDK的方法也能实现但是Guava更简单些。Joiner不仅可以连接字符串还可以吧Map中键值对串联起来。

3、基本类型工具:基本类型工具在primitives包中,以基本类型名+S的方式命名的,如Ints是以int的工具类,Doubles是double的工具类。

建议141:Apache扩展包

Apache Commons通用扩展包基本上是每个项目都会使用的,一般情况下lang包用作JDK的基础语言扩展。Apache Commons项目包含非常好用的工具,如DBCP、net、Math等。

建议142:推荐使用Joda日期时间扩展包

Joda可以很好地与现有的日期类保持兼容,在需要复杂的日期计算时使用Joda。日期工具类也可以选择date4j:1、本地格式的日期时间:如当前时间DateTime d=new DataeTime();本地日期格式d.toLocalDate();2、日期计算,比如计算100天后事星期几使用JDK日期类比较麻烦,使用Joda就会很简单。d.plusHours(100).dayofWeek();加100小时候周几。DateTime是一个不可变类型,与String非常相似即使通过plusXX。minusXX等方法进行操作,d仍然不会变。只是生成一个新的对象。但Joda提供一个可变类型的日期对象:MutableDateTime类。

建议143:可以选择多种Collections扩展

三个比较有个性的Collections扩展工具包:1、FastUtil,主要提供两种功能:一种是限定键值类型的Map、List、Set等,另一种是大容量的集合;2、Trove,提供了一个快速、高效、低内存消耗的Collection集合,并且还提供了过滤和拦截功能,同时还提供了基本类型的集合,优势在于性能上,在进行一般的增删改它的相应比JDK集合少一个数量级。3、lambdaj,是一个纯净的集合操作工具,它不会提供任何的集合扩展,只会提供对集合的操作,比如查询、过滤、统一初始化等

建议144:提倡良好的代码风格

提高可读性,良好的编码风格包括以下几种特征:1、整洁;2、统一;3、流行;4、便捷,推荐使用Checkstyle检测代码是否遵循规范。

建议145:不要完全依靠单元测试来发现问题

单元测试的目的是保证各个独立分隔的程序单元的正确性,虽然它能够发现程序中存在的问题(或缺陷、或错误),但是单元测试只是排查程序错误的一种方式,不能保证代码中的所有错误都能被单元测试挖掘出来,原因:1、单元测试不可能测试所有的场景(路径):包括正常场景测试代码的主逻辑、边界数据场景用来测试在边界情况下的数据场景,异常场景测试异常故障下能否按照预期运行;2、代码整合错误是不可避免的;3、部分代码无法(或很难)测试;4、单元测试验证的是编码人员的假设。

建议146:让注释正确、清晰、简洁

坏注释:1、废话式注释、2、故事式注释(太多)。3、不必要注释。4、过时式注释。5、大块式注释。6、流水账式注释。7、转为javaDoc编写的注释。号类型的注释:1、法律版本信息。2、解释意图的注释。3、警告性注释。4、TODO注释。注释不是美化剂,而是催化剂,或为优秀加分,或为拙略减分。

建议147:让接口的职责保持单一

接口职责一定要单一,实现类职责尽量单一(单一职责原则(Single Responsibility Principle,简称SRP)有以下三个优点:1、类的复杂性降低,接口功能单一复杂度减少,当然接口数量就会增多;2、可读性和可维护性提高;3、降低变更风险。以电话通信为例说明如何实施单一职责:1、分析职责。2、设计接口。3、合并实现。

建议148:增强类的可替换性

Java的三大特征:封装、继承、多态;说说多态,一个接口可以有多种实现方式,一个父类可以有多个子类,并且可以把不同的实现或子类赋给不同的接口或父类。多态的好处非常多,其中一点就是增强了类的可替换性,但是单单一个多态特性,很难保证我们的类是完全可以替换的,幸好还有一个里氏替换原则来约束。里氏替换原则:所有引用基类的地方必须能透明地使用其子类的对象。通俗点讲,只要父类型能出现的地方子类型就可以出现,而且将父类型替换为子类型还不会产生任何错误或异常,使用者可能根本就不需要知道是父类型还是子类型。为了增强类的可替换性,在设计类时需要考虑以下三点:1、子类型必须完全实现父类型的方法;2、前置条件可以被放大;3、后置条件可以被缩小。

建议149:依赖抽象而不是实现

此处的抽象是指物体的抽象,比如出行,依赖的是抽象的运输能力,而不是具体的运输交通工具。依赖倒置原则(Dependence Inversion Principle,简称DIP)要求实现解耦,保持代码间的松耦合,提高代码的复用率。DIP的原始定义包含三层含义:1、高层模块不应该依赖底层模块,两者都应该依赖其抽象;2、抽象不应该依赖细节;3、细节应该依赖抽象;DIP在Java语言中的表现就是:1、模块间的依赖是通过抽象发生的,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或抽象类产生的;2、接口或抽象类不依赖于实现类;3、实现类依赖接口或抽象类;更加精简的定义就是:面向接口编程。实现模块间的松耦合遵循规则:1、尽量抽象;2、表面类型必须是抽象的;3、任何类都不应该从具体类派生;4、尽量不要覆写基类的方法;5、抽象不关注细节。

建议150:抛弃7条不良的编码习惯

7条经常犯的错误:1)自由格式的代码;2)不使用抽象的代码;3)彰显个性的代码;4)死代码;5)冗余代码;6)拒绝变化的代码;7)自以为是的代码。

建议151:以技术人员自律而不是工人

20条建议技术人员定向培养:1、熟悉工具。2、使用IDE。3、坚持编码。 4、编码前思考。  5、坚持重构。6、多写文档。 7、保持程序版本的简单性。8、做好备份。 9、做单元测试。 10、不要重复发明轮子。11、不要拷贝。 12、让代码充满灵性。13、测试自动化。 14、做压力测试。15、“剽窃”不可耻。 16、坚持向敏捷学习。17、重里更重面。 18、分享。19、刨根问底。 20、横向扩展。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编写java程序151条建议读书笔记(20) 的相关文章

  • Unity ScrollView左右拖拽翻页

    ScrollView来实现左右拖拽的翻页 类似于微信 左右拖拽时候上下无法拖拽 上下拖拽的时候左右无法拖拽 并且左右拖拽的是时候 会有弹力进行对对齐 using System Collections using System Collect
  • C++这么难,为什么我们还要学习C++?

    文章目录 前言 1 为什么难学 2 C 的意义 3 什么时候该用C 4 如何学习C 5 学前勉言 前言 C 可算是一种声名在外的编程语言了 这个名声有好有坏 从好的方面讲 C 性能非常好 哪个编程语言性能好的话 总忍不住要跟 C 来单挑一下
  • Linux下WiFi驱动开发——WiFi基础知识解析(转)

    详见 https blog csdn net zqixiao 09 article details 51103615
  • SQL Server 命令行管理工具:SqlLocalDB.exe

    SqlLocalDB exe 是一个简单的工具 它使用户能够从命令行轻松管理 LocalDB 实例 它作为 LocalDB 实例 API 的简单包装实现 与在很多类似的 SQL Server 工具 例如 SQLCMD 中一样 参数作为命令行
  • flask框架实现文件下载功能

    传入文件名即可下载文件 from flask import Flask send file Response send from directory app Flask name app route download def downloa
  • Python编程题

    把数组 0 1 1 0 1 1 0 1 1 1 0 0 中所有的1排到左侧 0排到右侧 方法1 思路 1 首先进行可以保证0在左侧 1在右侧 2 新建一个空列表 3 把原列表中的值从最后1个复制给新建列表 直到第一个元素被复制完 list1
  • Qt 画图,void A::paintEvent(QPaintEvent *event){..}这函数怎么调用它?

    不用调用 需要用这个函数的时候调用A gt update 就可以得到调用这个函数的目的
  • shell中单引号、双引号、反引号的用法及区别

    单引号 这个比较暴力 不管单引号里面有什么都原样输出 无视一切变量 所见即所得 如果要用来做字符比较和输出 注意不能输出变量 也不认识通配符 命令等 even ubuntu echo a PATH aa a PATH aa 双引号 双引号感
  • Leetcode刷题总结-3.二叉树篇

    Leetcode刷题总结 二叉树刷题心得 总结 文章目录 Leetcode刷题总结 前言 一 二叉树刷题思路 二 美团面试题 2 1 第十套卷面试题 2 2 第九套卷面试题 三 华为研发工程师编程题 四 华为2016研发工程师编程题 前言
  • 【华为OD机试真题2023B卷 JAVA&JS】太阳能板最大面积

    华为OD2023 B卷 机试题库全覆盖 刷题指南点这里 太阳能板最大面积 知识点分治 时间限制 1s 空间限制 32MB 限定语言 不限 题目描述 给航天器一侧加装长方形或正方形的太阳能板 图中的红色斜线区域 需要先安装两个支柱 图中的黑色
  • 【项目总结】基于SpringBoot+Ansj分词+正倒排索引的Java文档搜索引擎项目总结

    文章目录 项目介绍 开发背景 主要用到的技术点 前端 后端 Ansj分词 实现索引模块 实现Parser类 实现Index类 完善Parser类 优化制作索引速度 实现搜索模块 实现DocSearcher类 处理暂停词 项目编写过程中遇到的
  • Hadoop系统入门之Join在MapReduce中的实现

    MapReduce Interview 描述如何使用MapReduce来实现join的功能 考察点 1 MapReduce执行流程 2 JOIN的底层执行过程 3 JOIN的多种实现方式 ReduceJoin shuffle MapJoin
  • 怎样将计算机32位换为62位,电脑32位怎么换62位

    大家好 我是时间财富网智能客服时间君 上述问题将由我为大家进行解答 电脑32位换62位的方法如下 1 备份原来的操作系统中的文件 特别注意收藏夹 我的文档 以及桌面等位置的文件 2 准备好64位操作系统的安装光盘或者ISO映像 制作操作系统
  • 关于Boolean==Boolean和Boolean=Boolean的启示

    昨晚做java面试题 一道原题是这样的 来自 JAVA最最最 基本的面试题 慕课手记 http www imooc com article 13754 6 给出以下代码 请问该程序的运行结果是什么 class Example public
  • C++中将csv文件中的数据存储到数组中

    ifstream fin filename c str 以输入方式打开文件存到缓冲空间fin中 string line int i 0 int comma 0 while getline fin line 读取fin中的整行字符存在line
  • 责任链中的嵌套使用

    1 按照之前的业务 用户建档后 挂号 生成挂号费用 根据挂号费 根据用户的身份生成不同的金额 儿童或者特殊人群挂号免费 2 具体实现 我们需要增加几个符合过滤器 public class CompositeFreeFilter extend
  • Winform ListView控件用法

    用法一 1直接从工具箱里把ListView拖到控件上 2可在窗体的Load 事件里 写如下代码 设置一些常用属性 listView1 View View Details listView1 LabelEdit true listView1
  • javascript全量匹配屏蔽词

  • iptables官方手册整理

    iptables官方手册整理 目录 1 简介 2 首先 什么是包过滤 3 快速入门指南 4 数据包过滤流程 5 具体如何使用Iptables命令实现过滤功能 6 地址转换 NAT 7 排除建议 1 简介 读者们 大家好 在这里我们假设你已经
  • 安装golang项目的 GVM

    GITHUB地址 https github com moovweb gvm bash lt lt curl s S L https raw githubusercontent com moovweb gvm master binscript

随机推荐

  • keras fine-tune方法

    https blog csdn net jdzwanghao article details 80697104
  • lzma算法分析

    lzma算法分析 这几天在公司主要在做压缩相关 记录一下所得 目前业界主流的压缩算法感觉并不多 好用的就Huffman lz系列 其他的像差分编码 vlq编码 感觉只能做个数据预处理 或者一种小范围的压缩 lz系列有很多 主要有lz77 l
  • 禁用系统【快应用】,停止【快应用】自动弹出

    快应用 九大厂商同时宣布建立即时应用生态发展联盟 通过统一标准让开发者低成本接入 快应用 在研发接口 场景接入 服务能力和接入方式上建设标准平台 以平台化的生态模式对个人开发者和企业开发者全品类开放 此次九大厂商共建 快应用 标准和平台 最
  • C语言:操作符以及部分表达式介绍

    目录 1 操作符 1 1 算数操作符 1 2 移位操作符 1 3 位操作符 1 4 1 赋值操作符 1 4 2 复合赋值符 1 5 单目操作符 1 6 关系操作符 1 7 逻辑操作符 1 8 条件操作符 1 9 逗号操作符 1 10 下标引
  • udp发包结合tkinter

    import socket import tkinter from tkinter import filedialog from tkinter filedialog import def action 获取输入框内容 date entry
  • 深度学习双显卡配置_更新深度学习装备:双(1080Ti)显卡装机实录

    前言 之前一直在装有一张1080Ti的服务器上跑代码 但是当数据量超过10W 图像数据集 的时候 训练时就稍微有点吃力了 速度慢是一方面 关键显存存在瓶颈 导致每次训练的batch size不敢调的过高 batch size与训练结果存在一
  • 播放器实战22 解决花屏与卡顿问题

    1 内存对齐 1 1什么是内存对齐 在C语言中 结构是一种复合数据类型 其构成元素既可以是基本数据类型 如int long float等 的变量 也可以是一些复合数据类型 如数组 结构 联合等 的数据单元 在结构中 编译器为结构的每个成员按
  • 小熊派笔记2

    GPIO案例 GPIO接口函数 初始化 wifiiot gpio h接口 wifiiot gpio ex h接口 扩展函数 设置GPIO拉力和驱动器强度 LED对应的gpio引脚是gpio2通过控制gpio2输出的电平信号来实现闪烁 设置
  • 三极管和场效应管-易错点

    NPN三极管是电流控制器件 共发射极电路中 放大区 Ice Ib x Vbe正偏 Vbc反偏 电势 Vc Vb Ve 饱和区 Ice Ib x 两个都正偏 电势 Vb Vc Ve Vce之间是饱和管压降Vces 截止区 Ice 0 两个都反
  • VerilogHDL实现除法操作

    硬件电路中实现除法操作一般基于两种方式 乘法操作和减法操作 基于减法的除法器 对于32位的无符号除法 被除数a除以除数b 他们的商和余数位数一定不超过32位 首先将a转换为32位 b也转换为32位 在每周期的开始 先将a左移一位 末尾补0
  • 如何知道你的Linux内核占用的内存大小?

    如何知道你的Linux内核占用的内存大小 1 代码段等 2 kernel heap 2 1 kmalloc 2 2 vmalloc 3 进程的页表 4 内核占用内存大小总和 1 代码段等 内核所需的代码段 bss段 内核栈等 dmesg g
  • 双调排序算法的实现(C++)

    双调排序算法的实现 C 双调排序 Bitonic Sort 是一种并行排序算法 它在某些情况下比传统的排序算法具有更好的性能 该算法的特点是可以通过并行比较和交换操作来对元素进行排序 适用于并行计算环境 本文将介绍双调排序算法的实现 并提供
  • subList截图数据集合,便于分页或分批次保存至数据库

    import java util ArrayList import java util List public class subList param list 待切割集合 param len 集合按照多大size来切割 param
  • ZNYQ初体验,持续记录中...

    首先在VIVADO中创建zynq PS核 步骤如下 如下新建工程 新建 block design add ip 选择zynq7 processing system 如下图所示 双击打开配置界面如下 下面我们简要地介绍一下页面导航面板中各个页
  • 解决页面禁止拷贝的问题

    众所周知 像这种禁止的动作一般都是网页中的javascript在作怪 那么 我们直接把他禁用就好了吖 其实 最简单的 在你前面网页的导航栏里面输入javascript void 就可以尽情的白嫖了
  • go语言 FindWindow

    Go 语言中的 FindWindow 函数是用于查找窗口句柄的函数 它是由 Windows API 提供的 在 Go 中通过 syscall 包来调用 用法示例 packagemain import fmt syscall unsafe v
  • 有趣的数据结构算法5——利用循环链表解决Josephus问题

    有趣的数据结构算法5 利用循环链表解决Josephus问题 题目复述 解题思路 实现代码 GITHUB下载连接 本次教程主要讲述如何利用循环链表解决Josephus问题 题目复述 据说著名犹太历史学家 Josephus有过以下的故事 在罗马
  • Selenium碰到的异常记录

    Java版本的Selenium异常记录 1 没有找到类的异常 NoClassDefFoundError 异常如下 Exception in thread main java lang NoClassDefFoundError com goo
  • 记录Android开发中SELINUX权限问题

    记录Android开发中SELINUX权限和用户权限问题 在安卓开发中 当linux内核中配置了SELINUX权限管理 访问硬件相关的设备文件 led tty等 时 如果没有对文件和访问文件的程序设置selinux的权限 就有可能报如下错误
  • 编写java程序151条建议读书笔记(20)

    建议139 大胆采用开源工具 MVC框架有Structs 也有Spring MVC WebWorker IoC容器有Spring 也有Coolgle Guice ORM有Hibernate MyBatis 日志有经典的log4j 崭新的lo