专注Java教育14年 全国咨询/投诉热线:400-8080-105
动力节点LOGO图
始于2009,口口相传的Java黄埔军校
首页 学习攻略 Java学习 十大Java代码规范

十大Java代码规范

更新时间:2022-10-10 10:36:47 来源:动力节点 浏览833次

1. 变量范围、可读性和 Lambda 表达式

在 Java 中,声明的每个变量都有一个作用域。这意味着变量的可见性和使用必须仅限于范围内。在局部变量的情况下,从其声明点到声明它的方法或代码块的末尾都是可见的。在可能使用的点附近声明一个变量是一个好习惯。这不仅增强了代码的可读性,而且使调试更简单。

尝试
   连接 con = DriverManager。获取连接(DATABASE_URL,
      用户名密码);
   语句 stmt = con.createStatement();
   结果集 rs = stmt.executeQuery(SQL_QUERY)
){
   //... 
}捕获(SQLException e){
   e.printStackTrace();
}

在代码片段中观察局部变量的范围是如何限制在声明它们的块内的。一旦块结束,变量就看不见了。此外,代码变得更加直观、易读和干净。

但是,从 Java 8 开始,我们可以利用 lambda 表达式使代码更加简洁和直观。为了说明这个想法,请注意我们如何在一行 lambda 表达式中组合许多实用程序。

整数[] nums={90,71,26,34,42,35,66,57,88,89};

打印原始数字。

最终列表<整数> l1 = 数组。asList (nums);
系统。out .printf( "原文:%s%n" ,l1);

现在我们使用 lambda 表达式来打印升序排序后的数字。

最终列表<整数> l2 = 数组。流(数字).sorted 
   ().collect(Collectors.toList ());
系统。out .printf( "排序后:%s%n" ,l2);

我们可以应用更多的实用程序,例如只打印那些大于 50 的数字,然后按升序对它们进行排序。

最终列表<整数> l3 = 数组。流(数字)
.filter(num -> num > 50).collect(Collectors.toList ( ));
系统。out .printf( "只对大于 50 的数字排序
   : %s%n" , l3);

2.类字段

在 Java 中,方法要么属于一个类,要么属于一个接口。因此,局部变量可能会被程序员无意中赋予与类成员变量相同的名称。然而,Java 编译器能够从范围中选择正确的编译器。此外,现代 IDE 足够复杂,可以识别冲突。无论如何,程序员自己应该有足够的责任来避免这种冲突,因为结果可能是灾难性的。下面的代码说明了如果我们不处理冲突的变量名,我们如何得到非常不同的结果。

public class TestClass {
   私人双倍佣金= 5.5d;
   public double increaseCommission( final double newComm){
       double Commission = newComm;
      佣金+=佣金;
      退货佣金;
   }
   public double getCommission(){
      返回佣金;
   }
   公共静态无效{TestClass m = new TestClass();
      系统。out .println(m.increaseCommission(3.3));
      系统。出.println(m.getCommission());
   }
}

避免与具有局部变量的类的字段名称冲突的另一种方法是使用this关键字。例如this.commission总是只引用类字段。但是,经验表明,最好在构造函数以外的方法中完全使用不同的名称,以避免字段名称冲突。

3. 将方法参数视为局部变量

在 Java 中,一个变量一旦声明就可以被重用。因此,方法参数中声明的非最终局部变量也可以用不同的值重用。但是,这不是一个好主意,因为变量作为方法参数发送应该保存它所带来的值的值,即方法使用的原始值。如果我们改变这个值,我们将完全失去方法中带来的原始内容。相反,我们必须做的是将值复制到另一个变量并进行必要的处理。但是,我们可以通过使用final关键字来完全限制参数变量并使之成为常量,如下所示。

公共双计算(最终双newVal){
   双tmp = newVal;
    // ...
   返回tmp;
}

4. 装箱和拆箱

在 Java 中,装箱和拆箱是基本类型与其对应的包装类之间的转换技术的另一面。包装类什么都不是,而是原始类型的“类”版本,例如int到Integer、float到Float、double到Double、char到Character、byte到Byte、Boolean到Boolean等等。装箱是将int转换为Integer,拆箱是从Integer转换回来到int。编译器经常在后台执行转换;这称为自动装箱。但是,有时,这种自动装箱可能会产生意想不到的结果,我们必须意识到这一点。

公共静态无效更新(最终双newVal){
   // ...
}
最终双 val = null ;
更新(val);

5. 接口

因为接口不依赖于任何方法实现(默认方法除外),所以我们必须在不需要具体类的地方充分使用它们。接口就像合同一样,具有足够的自由度和灵活性来布置合同。具体课程可以利用灵活性来丰富和补充其业务议程。尤其如此,当实施涉及外部系统或服务时,通常可以看到这一点。

包com.mano.examples;
公共接口Payable {
    public double calcAmount();
}
包com.mano.examples;
公共类Invoice实现Payable {
    private String itemNumber ;
   私有字符串项目名称;
   私人 int 数量;
   私人双单位价格;
   public Invoice(String itemName, int quantity,
          double unitPrice) {
       // ...
   }
   public int getQuantity() {
       // ...
      返回数量;
   }
   public double getUntPrice() {
       // ... 
      return unitPrice ;
   }
   @覆盖
   public double calcAmount() {
       return getQuantity()*getUntPrice();
   }
}

6. Strings

Java 中没有其他类型像String一样被扩展。Java 字符串以 UTF-16 格式表示,并且是不可变对象。这意味着每次我们执行像连接这样需要修改原始字符串的操作时,都会创建一个新的字符串对象。仅为执行所需操作而创建的这个中间字符串对象既浪费又低效。这是因为中间对象的创建是无关的;它涉及垃圾收集,尽管我们可以避免它。有两个配套的字符串类,称为StringBuffer和StringBuilder,它们可以恰当地促进我们可能需要的那种字符串操作。这两个类就是为此而构建的。StringBuffer和_StringBuilder是前者是线程安全的。我们可以在需要大量字符串操作时使用这两个类,而不是使用不可变的String实例。

StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append( "你好" );
stringBuilder.append(108);
stringBuilder.deleteCharAt(0);
stringBuilder.insert(0, "h" );
stringBuilder.replace(stringBuilder.length() - 3,
   stringBuilder.length(), "." );
系统。out .println(stringBuilder);

7. 命名约定

Java 命名约定是一组规则,使 Java 代码在 Java 项目和库中看起来一致。它们不是严格的规则,而是作为良好编程实践的准则。因此,由于仓促或反抗而违反代码统一性的神圣性并不是一个好主意。规则非常简单。

包名是小写的类型:javax.sql、org.junit、java.lang。

类、枚举、接口和注释名称以大写形式输入:Thread、Runnable、@Override。

方法和字段名称以驼峰形式输入:deleteCharAt、add、isNull。

常量是用下划线分隔的大写类型:SIZE、MIN_VALUE。

局部变量以驼峰形式输入:employeeName、birthDate、email。

这些约定已经成为 Java 的一部分,几乎每个程序员都虔诚地遵循它们。结果,这方面的任何变化看起来都是古怪和错误的。遵循这些约定的一个明显好处是代码风格与库或框架代码保持一致。它还可以帮助其他程序员在需要时快速获取代码,从而利用代码的整体可读性。

8. 标准库

Java以其丰富的库集而闻名。然而,并不是每个库都经过完美设计,但在大多数情况下它们都是最优的。Java 不时发布新库并积极改进现有库。因此,应始终尽可能多地使用库中的类、方法、接口、Java枚举和注释。这可以大大减少生产时间。此外,所包含的功能都经过了很好的测试。最好在需要时使用库中的它们,而不是重新发明轮子。

由于 Java 平台不断发展,因此我们必须密切关注我们从第三方库或框架中包含的特性,这些特性已经存在于 Java 标准库中。经验法则是先用尽内部资源,然后再从外部资源中剔除支持。

9. 不变性

不变性的概念非常重要。我们必须决定我们打算设计的类是否可以不可变,因为不可变性保证了它几乎可以在任何地方使用,而不会出现并发修改的任何麻烦。不幸的是,并非所有类都可以设计为不可变的。但是,请确保我们必须尽可能这样做。这使生活变得更加轻松。您可以稍后感谢我。

10. 测试

测试驱动实践 (TDD) 是 Java 社区中代码质量的象征。测试是现代 Java 开发的一部分,Java 标准库有 Junit 框架来帮助实现这个方向。因此,初出茅庐的 Java 程序员不应该回避用代码编写测试用例。尽量保持测试简单而简短,一次只关注一件事。生产环境中可以有数百个测试用例。编写测试用例的一个明显好处是它们提供了正在开发的特性的即时反馈。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>