java核心技术卷阅读笔记六_对象与类_构造_类设计技巧_02

一 方法参数(重点)

  • 按值调用(call by value) 表示方法接收的是调用者提供的值。
  • 而按引用调用 (call by reference) 表示方法接收的是调用者提供的变量地址。
  • 一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值
  • Java 程序设计语言对对象采用的不是引用调用,实际上, 对象引用是按值传递的。

二 对象构造

2.1 调用另一个构造器

  • 如果构造器的第一个语句形如 this(…), 这个构造器将调用同一个类的另一个构造器。
public Employee(double s) { 
	// calls Employee(String, double) 
	this("Employee #" + nextld, s); 
	nextld++;
 }
  • 当调用 new Employee(60000) 时, Employee(double) 构造器将调用 Employee(String,double) 构造器。

2.2 初始化块

  • 前面已经讲过两种初始化数据域的方法:
    • 在构造器中设置值
    • 在声明中赋值
  • 实际上,Java 还有第三种机制, 称为初始化块(initializationblock)。在一个类的声明中, 可以包含多个代码块。只要构造类的对象,这些块就会被执行。
  • 首先运行初始化块,然后才运行构造器的主体部分。
public class People {

    private String name;
    private String age;

    // 初始化块
    {
        name="张三";
        age="12";
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public People(String name, String age) {
        this.name = name;
        this.age = age;
    }

    public People() {
    }
}

三 类设计技巧

3.1 一定要保证数据私有

这是最重要的;绝对不要破坏封装性。有时候, 需要编写一个访问器方法或更改器方法, 但是最好还是保持实例域的私有性。很多惨痛的经验告诉我们, 数据的表示形式很可能会改 变, 但它们的使用方式却不会经常发生变化。当数据保持私有时, 它们的表示形式的变化不 会对类的使用者产生影响, 即使出现 bug 也易于检测。

3.2 一定要对数据初始化

Java 不对局部变量进行初始化, 但是会对对象的实例域进行初始化。最好不要依赖于系 统的默认值, 而是应该显式地初始化所有的数据, 具体的初始化方式可以是提供默认值, 也 可以是在所有构造器中设置默认值

3.3 不要在类中使用过多的基本类型

就是说,用其他的类代替多个相关的基本类型的使用。这样会使类更加易于理解且易于 修改。例如, 用一个称为 Address 的新的类替换一个 Customer 类中以下的实例域:

private String street;
private String city;
private String state;
private int zip;

这样, 可以很容易处理地址的变化, 例如,需要增加对国际地址的处理

3.4 不是所有的域都需要独立的域访问器和域更改器

或许, 需要获得或设置雇员的薪金。而一旦构造了雇员对象, 就应该禁止更改雇用日 期,并且在对象中,常常包含一些不希望别人获得或设置的实例域, 例如, 在 Address 类中, 存放州缩写的数组。

3.5 将职责过多的类进行分解

这样说似乎有点含糊不清, 究竟多少算是“ 过多” ? 每个人的看法不同。但是,如果明 显地可以将一个复杂的类分解成两个更为简单的类,就应该将其分解(但另一方面,也不要 走极端。设计 10 个类,每个类只有一个方法,显然有些矫枉过正了) 。

3.6 类名和方法名要能够体现它们的职责

与变量应该有一个能够反映其含义的名字一样, 类也应该如此(在标准类库中, 也存在 着一些含义不明确的例子, 如:Date类实际上是一个用于描述时间的类)。 命名类名的良好习惯是采用一个名词(Order)、 前面有形容词修饰的名词( RushOrder) 或动名词(有“ -ing” 后缀)修饰名词(例如, BillingAddress)。对于方法来说,习惯是访问 器方法用小写 get 开头 (getSalary), 更改器方法用小写的 set 开头(setSalary)

3.7 优先使用不可变的类

LocalDate 类以及 java.time 包中的其他类是不可变的— —没有方法能修改对象的状态。类似 plusDays 的方法并不是更改对象,而是返回状态已修改的新对象。 更改对象的问题在于, 如果多个线程试图同时更新一个对象,就会发生并发更改。其结 果是不可预料的。如果类是不可变的,就可以安全地在多个线程间共享其对象。 因此, 要尽可能让类是不可变的, 这是一个很好的想法。对于表示值的类, 如一个字符 串或一个时间点,这尤其容易。计算会生成新值, 而不是更新原来的值。 当然,并不是所有类都应当是不可变的。如果员工加薪时让 raiseSalary 方法返回一个新 的 Employee 对象, 这会很奇怪。

猜你喜欢

转载自blog.csdn.net/weixin_42430194/article/details/86589925