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 practice
  private 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"地方。

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

相关文章

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值