学习笔记20170704

来源:互联网 发布:陕西师范远程网络教育 编辑:程序博客网 时间:2024/05/21 17:27

一、单例类

      大部分时候都把类的构造方法定义成public访问权限,允许任何类自由创建该类的对象。但在某些时候,允许其他类自由创建该类的对象没有任何意义,还可能造成系统性能下降。如果一个类始终只能创建一个实例,则这个类被称为单例类。

1、单例类的创建要求:

①该类的构造方法使用private修饰,将该类的所有构造方法隐藏起来;

②需要提供一个public方法作为该类的访问点,用于创建该类的对象,且该方法必须使用static修饰;(因为调用该方法之前还不存在对象,因此调用该方法的不可能是对象,只能是类)

③该类还必须缓存已经创建的对象,否则该类无法知道是否曾经创建过对象,也就无法保证只创建一个对象。该成员变量需要被上面的静态方法访问,故该成员变量必须也使用static修饰。


例:

public class Singleton {

    // 使用一个类变量来缓存曾经创建的实例
    private static Singleton instance;

    // 对构造方法使用private修饰,隐藏该构造方法
    private Singleton() {

    }

    // 提供一个静态方法,用于返回Singleton实例
    // 该方法可以加入自定义控制,保证只产生一个Singleton对象
    public static Singleton getInstance() {
        // 如果instance为null,则表明还不曾创建Singleton对象
        // 如果instance不为null,则表明已经创建了Singleton对象
        // 将不会重新创建新的实例
        if (instance == null) {
            // 创建一个Singleton对象,并将其缓存起来
            instance = new Singleton();
        }
        return instance;
    }
}


public class SingletonTest {

    public static void main(String[] args) {
        // 创建Singleton对象不能通过构造方法,只能通过getInstance方法来得到实例
        Singleton s1 = Singleton.getInstance();
        Singleton s2 = Singleton.getInstance();
        System.out.println(s1 == s2);//将输出true
    }
}


正是通过上面getInstance方法提供的自定义控制(这也是封装的优势:不允许自由访问类的成员变量和实现细节,而是通过方法来控制合适暴露),保证Singleton类只能产生一个实例。所以,在SingletonTest类的main()方法中,看到两次产生的Singleton对象实际上是同一个对象。


二、final成员变量

在编写程序时,用final修饰的成员变量必须由程序员显式地指定初始值。final修饰的类变量,要么在定义该类变量时指定初始值,要么在初始化块中为该类变量指定初始值,要么在构造方法中指定初始值,以上三个地方不能重复赋值。(注意:程序在编译的时候,不会对成员变量进行默认初始化)


三、final局部变量

如果final修饰的局部变量在定义时没有指定默认值,则可以在后面代码中对该final变量赋初始值,但只能一次,不能重复赋值;如果final修饰的局部变量在定义时已经指定默认值,则后面代码中不能再对该变量赋值。(如果在形参中用了final,则不能在形参构造方法中对该变量赋值)

原创粉丝点击