《Kotlin核心编程》 ——3.5.2 天生的单例:object
3.5.2 天生的单例:object
单例模式最大的一个特点就是在系统中只能存在一个实例对象,所以在Java中我们必须通过设置构造方法私有化,以及提供静态方法创建实例的方式来创建单例对象。比如,现在我们要创建一个数据库配置的单例对象:
public class DatabaseConfig {
private String host;
private int port;
private String username;
private String password;
private static DatabaseConfig databaseConfig = null;
private static String DEFAULT_HOST = "127.0.0.1";
private static int DEFAULT_PORT = 3306;
private static String DEFAULT_USERNAME = "root";
private static String DEFAULT_PASSWORD = "";
private DatabaseConfig(String host, int port, String username, String password) {
this.host = host;
this.port = port;
this.username = username;
this.password = password;
}
static DatabaseConfig getDatabaseConfig() {
if (databaseConfig != null) {
return databaseConfig;
} else {
return new DatabaseConfig(DEFAULT_HOST, DEFAULT_PORT, DEFAULT_USERNAME, DEFAULT_PASSWORD);
}
}
}
这是用Java实现的一个最基本单例模式的精简例子(省略了多线程以及多种参数创建单例对象的方法)。它依赖static关键字,同时还必须将构造方法私有化。
在Kotlin中,由于object的存在,我们可以直接用它来实现单例,如下所示:
object DatabaseConfig {
var host: String = "127.0.0.1"
var port: Int = 3306
var username: String = "root"
var password: String = ""
}
是不是特别简洁呢?由于object全局声明的对象只有一个,所以它并不用语法上的初始化,甚至都不需要构造方法。因此,我们可以说,object创造的是天生的单例,我们并不需要在Kotlin中去构建一个类似Java的单例模式。由于DatabaseConfig的属性是用var声明的String,我们还可以修改它们:
DatabaseConfig.host = "localhost"
DatabaseConfig.poet = 3307
由于单例也可以和普通的类一样实现接口和继承类,所以你可以将它看成一种不需要我们主动初始化的类,它也可以拥有扩展方法,有关扩展的内容将会在后面章节讲解。单例对象会在系统加载的时候初始化,当然全局就只有一个。那么,object声明除了表现在单例对象及上面的说的伴生对象之外,还有其他的作用吗?它还有一个作用就是替代Java中的匿名内部类。下面我们就来看看它是如何做的。
- 点赞
- 收藏
- 关注作者
评论(0)