Java代码中的典型错误

该页面包含在与我一起工作的人的Java代码中看到的最典型的错误。 静态分析(出于明显的原因,我们使用查询无法捕获所有错误,这就是为什么我决定在此处列出所有错误的原因。

如果您要在此处添加其他内容,请告诉我,我们将竭诚为您服务。

列出的所有错误一般都与面向对象的编程有关,尤其是与Java有关。

类名

阅读这段简短的“什么是对象?” 文章。 您的班级应该是没有“验证者”,“控制器”,“经理”等的真实实体的抽象。如果您的班级名称以“ -er”结尾,那么这是一个错误的设计 。

而且,当然,公用事业类是反模式,如StringUtilsFileUtils ,并IOUtils来自Apache的。 以上是糟糕设计的完美示例。 阅读此后续文章: 实用程序类的OOP替代 。

当然,切勿添加后缀或前缀来区分接口和类 。 例如,所有这些名称都非常错误: IRecordIfaceEmployeeRecordInterface 。 通常,接口名称是真实实体的名称,而类名称应说明其实现细节。 如果没有关于实现的具体说明,请将其命名为Default, Simple或类似名称。 例如:

class SimpleUser implements User {};
class DefaultRecord implements Record {};
class Suffixed implements Name {};
class Validated implements Content {};

方法名称

方法可以返回值,也可以返回void 。 如果一个方法返回了一些东西,那么它的名称应该说明它返回的内容 ,例如(永远不要使用get前缀):

boolean isValid(String name);
String content();
int ageOf(File file);

如果返回void,则其名称应说明其作用 。 例如:

void save(File file);
void process(Work work);
void append(File file, String line);

刚才提到的规则只有一个例外-JUnit的测试方法。 它们在下面解释。

测试方法名称

JUnit测试中的方法名称应创建为不带空格的英语句子。 通过示例更容易解释:

/*** HttpRequest can return its content in Unicode.* @throws Exception If test fails*/
public void returnsItsContentInUnicode() throws Exception {
}

在JavaDoc的第一句中以要测试的类的名称开头,然后是can这一点很重要。 因此,您的第一句话应始终类似于“某人可以做某事”。

方法名称将声明完全相同,但没有主题。 如果在方法名称的开头添加一个主题,则应该得到完整的英语句子,如上例所示:“ HttpRequest以unicode返回其内容”。

注意测试方法不是以can开头的,只有JavaDoc注释以can开头。 此外,方法名称不应以动词开头。

始终将测试方法声明为throwing Exception是一个好习惯。

变量名

避免使用变量的复合名称,例如timeOfDayfirstItemhttpRequest 。 我的意思是:类变量和方法内变量。 变量名应足够长,以免在可见性范围内产生歧义,但如果可能,则不要太长。 名称应为单数或复数形式的名词,或适当的缩写。 例如:

List<String> names;
void sendThroughProxy(File file, Protocol proto);
private File content;
public HttpRequest request;

有时,如果构造函数将传入数据保存在实例化的对象中,则构造函数参数和类内属性之间可能会发生冲突。 在这种情况下,我建议通过删除元音来创建缩写(请参阅USPS如何缩写街道名称 )。

另一个例子:

public class Message {private String recipient;public Message(String rcpt) {this.recipient = rcpt;}
}

在许多情况下,可以通过读取变量的类名来确定变量名称的最佳提示。 只需写一个小写字母,就可以了:

File file;
User user;
Branch branch;

但是, 永远不要对原始类型(例如Integer numberString string

当存在多个具有不同特征的变量时,也可以使用形容词。 例如:

String contact(String left, String right);

建设者

没有例外,应该只有一个构造函数将数据存储在对象变量中。 所有其他构造函数都应使用不同的参数来调用此函数。 例如:

public class Server {private String address;public Server(String uri) {this.address = uri;}public Server(URI uri) {this(uri.toString());}
}

一次性变量

不惜一切代价避免一次性变量。 “一次性”是指仅使用一次的变量。 像这个例子:

String name = "data.txt";
return new File(name);

上面的变量仅使用一次,代码应重构为:

return new File("data.txt");

有时,在极少数情况下(主要是因为格式更好),可以使用一次性变量。 但是,请尽一切可能避免这种情况。

例外情况

不用说,您永远不要吞下异常,而应让它们冒出尽可能多的泡沫。 私有方法应始终允许检查的异常消失。

切勿将异常用于流量控制。 例如,此代码是错误的:

int size;
try {size = this.fileSize();
} catch (IOException ex) {size = 0;
}

严重的是,如果该IOException提示“磁盘已满”怎么办? 您是否仍会假设文件的大小为零并继续前进?

缩进

对于缩进,主要规则是括号应在行的结尾或在同一行上闭合(相反的规则适用于闭合括号)。 例如,以下内容是不正确的,因为第一个括号未在同一行上闭合并且其后有符号。 第二个支架也有麻烦,因为它前面有符号并且没有在同一行上打开:

final File file = new File(directory,"file.txt");

正确的缩进应如下所示:

StringUtils.join(Arrays.asList("first line","second line",StringUtils.join(Arrays.asList("a", "b"))),"separator"
);

缩进的第二个重要规则是,您应该在一行中放置尽可能多的字符-不得超过80个字符。 上面的示例无效,因为可以对其进行压缩:

StringUtils.join(Arrays.asList("first line", "second line",StringUtils.join(Arrays.asList("a", "b"))),"separator"
);

冗余常数

当您想在类方法之间共享信息时,应使用类常量,并且此信息是类的特征(!)。 不要使用常量代替字符串或数字文字-这是很糟糕的做法,会导致代码污染。 常量(与OOP中的任何对象一样)在现实世界中应具有含义。 这些常量在现实世界中具有什么含义:

class Document {private static final String D_LETTER = "D"; // bad practiceprivate static final String EXTENSION = ".doc"; // good practice
}

另一个典型的错误是在单元测试中使用常量以避免测试方法中重复的字符串/数字文字。 不要这样! 每种测试方法都应使用自己的一组输入值。

在每种新的测试方法中使用新的文本和数字。 他们是独立的。 那么,为什么它们必须共享相同的输入常量?

测试数据耦合

这是测试方法中数据耦合的示例:

User user = new User("Jeff");
// maybe some other code here
MatcherAssert.assertThat(user.name(), Matchers.equalTo("Jeff"));

在最后一行,我们将"Jeff"与第一行中的相同字符串文字相结合。 如果几个月后某人想要更改第三行的值,则他/她必须花费额外的时间来查找在同一方法中还使用"Jeff"地方。

为了避免这种数据耦合,您应该引入一个变量。

相关文章

您可能还会发现以下有趣的帖子:

  • 为什么NULL是错误的?
  • 对象应该是不可变的
  • 实用程序类的OOP替代
  • 避免字符串串联
  • 简单的Java SSH客户端

翻译自: https://www.javacodegeeks.com/2014/09/typical-mistakes-in-java-code.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/362242.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windwos下ntp服务器配置 arm平台ntp客户端获取同步时间

项目需要使用同步时间&#xff0c;在arm-linux开发板上&#xff0c;移植了ntp客户端&#xff0c;查看了一些资料&#xff0c;最终发现使用windows自带的ntp服务器比较方便&#xff0c;而且很靠谱&#xff0c;使用配置了一番&#xff0c;已经能够正常使用 详细步骤&#xff1a; …

css 控制图片最大宽度

CSS 限制图片最大宽度 (本文来自本站原创&#xff0c;转载请务必注明出处&#xff01;)我们在制作一个网页的时候&#xff0c;经常要对一个区域里可能出现的图片的宽度进行限制&#xff0c;不然它可能会把页面撑得很烂很烂。如果你采用固定宽度&#xff0c;长度来设置的话&…

BOM(Browser Object Model)

BOM&#xff08;浏览器对象模型&#xff09;&#xff0c;提供了一系列操作浏览器&#xff0c;获取浏览器信息的接口。这些接口在平时的工作中会经常用到&#xff0c;例如当前页面的刷新&#xff0c;获取url的参数等等。 注&#xff1a;图片来自 http://www.dreamdu.com/javascr…

入门 IT 行业,该具备哪些技能?

对于刚开始进入IT的新人来说&#xff0c;“必备技能”往往意味着一个长长的、标有重要度的学习列表&#xff0c;但是过长的列表通常会导致新人不知如何开始学习&#xff0c;压力倍增。本文尝试列举出最重要的几个技能&#xff0c;也期望通过此列表能给新人一个比较明确的学习重…

实验七作业

Part 1:验证性实验 将line29&#xff1a;for(i0;i<N;i)改为while(!feof(fp)) // 从文本文件file1.dat中读取数据&#xff0c;找出最高分和最低分学生信息&#xff0c;并输出在屏幕上 #include <stdio.h> #include <stdlib.h>#define N 10// 定义一个结构体类型…

块级格式化上下文(Block Formatting Context)

CSS块级格式化上下文是块级盒子的一种能力&#xff0c;这种能力并不是直接通过css属性声明而获得的&#xff0c;而是添加css的一部分相关属性之后自动获得的能力&#xff0c;也就是说没有一个明确的属性就是生成块级格式化上下文的。 块级格式化上下文的能力就是让具有该能力的…

这是最后的讨论!

Pun打算……让我们讨论Java final 。 最近&#xff0c;我们广受欢迎的博客文章“编码Java时的十个微妙的最佳实践”在JavaWorld的摘要和链接中有了很大的复兴&#xff0c;并提出了一组新的评论。 尤其是&#xff0c;JavaWorld编辑对我们对Java关键字“ final ”的观点提出了质…

前端性能优化方法总结

一个网站前端性能的好坏很大程度上影响了用户愿不愿意使用访问这个网站&#xff0c;因此对前端进行性能优化是个很重要的事情。  对于前端性能优化这个问题&#xff0c;主要学习自yahoo前端性能团队总结的35条黄金定律总结&#xff0c;觉得很全很赞&#xff0c;做个学习总结和…

JS中的数据类型转换

ES5中一共有6种数据类型&#xff0c;其中5种基本类型&#xff08;String、Number、Boolean、Null、Undefined&#xff09;&#xff0c;1种引用类型&#xff08;Object&#xff09;。基本类型值可以相互换转换&#xff0c;并且引用类型值也可以通过某种方式转换成基本类型值。 …

拯救我的操作系统

最近公司新装操作系统image都强制装win7&#xff0c;公司电脑一直拖着没有升级&#xff0c;家里也一直是用番茄花园版的xp&#xff0c;突然心血来潮去买了个win7的碟&#xff0c;心想最好是破解版的&#xff0c;回来一装&#xff0c;发现是所谓的旗舰版的&#xff0c;可恶的是这…

Hazelcast的MapLoader陷阱

Hazelcast提供的核心数据结构之一是IMap<K, V> &#xff0c;它扩展了java.util.concurrent.ConcurrentMap它基本上是一个分布式地图&#xff0c;通常用作缓存。 您可以将此类地图配置为使用自定义MapLoader<K, V> -每次尝试从该地图&#xff08;通过键&#xff09;…

《Android开发从零开始》——22.数据存储(1)

本节课的主要内容有&#xff1a;1.介绍Android中数据存储方式2.介绍SQLite3.讲解SQLite数据类型4.讲解基本SQL命令 课程下载地址&#xff1a;http://u.115.com/file/clc4te8w课件及源码下载地址&#xff1a;http://u.115.com/file/clc41tt5转载于:https://www.cnblogs.com/cool…

计划Java EE 7批处理作业

Java EE 7添加了使用JSR 352以标准方式执行批处理作业的功能。 <job id"myJob" xmlns"http://xmlns.jcp.org/xml/ns/javaee" version"1.0"><step id"myStep"><chunk item-count"3"><reader ref"…

webpack配置说明

webpack是一个现代JavaScript应用程序的静态模块打包器。 它有几个核心概念&#xff1a; 一、entry&#xff08;入口&#xff09; 指示webpack应该使用哪个模块&#xff0c;来作为构建其内部依赖图的开始&#xff0c; 可以在webpack.config.js中配置entry属性&#xff0c;来指…

poj 2137

题目大意&#xff1a; 农夫FJ想把他所有的牛在它们吃草的时候用一根绳子连起来&#xff08;就是1-2-3-1按顺序连接起来&#xff09;&#xff0c;每头牛有若干个吃草的位置&#xff0c;它们必须要在这些位置吃草。 用绳子连接两头牛需要绳子的长度公式为 Sqrt( Sqr( x1-x2 ) Sq…

JS中捉摸不透的==(宽松等于)

首先来看一个有意思的面试题&#xff1a; if(a 3 && a 4){//... }第一眼看到这个面试题我是拒绝的&#xff0c;这个等式根本不会成立&#xff0c;怎么会存在一个值既等于3并且还同时等于4呢&#xff1f;根本不可能。 但是在神奇的javascript中这个a是存在的。&…

vue脚手架的使用

安装&#xff1a;1.全局安装脚手架&#xff1a;cnpm install -g vue/cli 使用&#xff1a;2.新建文件夹,在当前目录执行命令 vue create "项目名称"3.配置&#xff1a;选择Manually select feautures--》空格选择Babel和CSS Pre-procesors--》选择Sass/SCSS(with dar…

Akka笔记–演员介绍

过去做过多线程的任何人都不会否认管理多线程应用程序有多么艰辛和痛苦。 我说管理是因为它一开始很简单&#xff0c;一旦您开始看到性能改进&#xff0c;它就会变得非常有趣。 但是&#xff0c;当您发现没有一种简单的方法可以从子任务中的错误或难以发现的僵尸错误中恢复时&a…

浏览器的同源策略与跨域

本文所有案例在本地址都可找到&#xff1a;https://github.com/dancingZhou/sameOrigin/tree/dev 什么是同源策略 两个页面地址中的协议、域名和端口号一致&#xff0c;则表示同源。 例如该地址 https://www.google.com 和以下地址对比 地址同源原因http://www.google.com否…

poj 1185

经典状态dp 代码&#xff1a; #include<iostream> #include<fstream> #include<cmath>using namespace std;int n,m;char map[101][11];int state[101][1024]; int num[101]; int value[1024]; int maxx;int ok(int s,int t){int i,j,k;for(i0;i<m;){jt&…