Java高效编程

本文前期会基于Efffective Java第二版来写,优先选取平时项目中接触比较多的注意点,在提炼书本的基础上补充平时项目中的一些见解。后期会脱离书本的建议给与自己对于高效java编程的想法,本文会持续更新。

如有侵权,请联系博主。

1. 遇到多个构造器参数时要考虑用构建器

静态工厂和构造器有一个共同的局限性,它们都不能很好地扩展到大量的可选参数。如何有个类有很多字段,用户每次使用不同的字段来初始化会变得有为麻烦,通常来说,对于少量字段的类,只需要少量的构造方法就能解决,当字段大于4个时,推荐使用构建器。例如:

public class Exam {
    private int chinese = 0;
    private int math = 0;
    private int english = 0;
    private int science = 0;
    private int history = 0;

    public static class Builder {
        private int chinese = 0;
        private int math = 0;
        private int english = 0;
        private int science = 0;
        private int history = 0;

        public Builder(int chinese, int math) {
            this.chinese = chinese;
            this.math = math;
        }

        public Builder setEnglish(int english) {
            this.english = english;
            return this;
        }

        public Builder setScience(int science) {
            this.science = science;
            return this;
        }

        public Builder setHistory(int history) {
            this.history = history;
            return this;
        }

        public Exam build() {
            return new Exam(this);
        }
    }

    public Exam(Builder builder) {
        this.chinese = builder.chinese;
        this.math = builder.math;
        this.english = builder.english;
        this.science = builder.science;
        this.history = builder.history;
    }

    public static void main(String[] args) {
        Exam exam1 = new Builder(100, 90).setEnglish(80).build();
        Exam exam2 = new Builder(90, 93).setScience(70).build();
    }
}

2. 将局部变量的作用域最小化--Effective Java第45条

在较早的语言(例如C语言)中要求局部变量必须在一个代码块的开头声明,但是在java,更加提倡将变量的声明尽可能的靠近第一次使用它的地方。提早声明一方面会给阅读带来困难,另一方面也扩大了该变量的作用范围,如果本不该使用这个变量的别的模块错误的使用后不易察觉,增加调试难度。

几乎每个变量的声明都应该初始化,但有时候有些变量没有添加初始化(例如对于一些需要特殊入参的工厂方法生成的变量),就应该推迟变量声明,直到可以声明。有个特殊情况,对于try-catch来说,当这个变量被方法初始化有可能会抛出异常,那么这个变量必须在try块内部初始化。但是如果这个变量需要在try块外面被使用,那么该变量需要提前声明并在try块中被有意义的初始化。

循环提供了特殊的机会来将变量的作用域最小化甚至没有(例如for-each),主要目的在于别的块不会错误的调用到只作用于自身的变量。

3. 谨慎地使用本地方法--Effective Java第54条

Java Native Interface(JNI)允许Java应用程序调用本地方法,本地方法指的是使用c或者c++等别的语言编写的方法。

当前使用本地方法的用途主要集中在1. 本地方法提供了访问遗留代码库的能力,很多早期的库函数都是使用c或者c++写的,一旦想访问就需要使用。 2. c和c++的计算速度是要快于java的,所以很多复杂的算法都是通过c或者c++实现的,调用算法需要使用本地方法。3. 将一些数据存放在c层代码中可以增加恶意用户的破解难度。当前工作中可能后面两天中接触的会更加多。

除了以上的优点,本地方法存在一些严重的缺点。由于c++等是平台相关的语言,没有虚拟机作为中间平台,因此使用本地方法的软件可移植性差。同时本地方法调试难度增加。因此,如果不是类似于调用java没有实现的算法或者其他必要的场景,不建议使用JNI调用本地方法。

猜你喜欢

转载自blog.csdn.net/weixin_48968045/article/details/107970526
今日推荐