《Kotlin核心编程》 ——3.5.2 天生的单例:object

举报
华章计算机 发表于 2020/02/21 23:11:07 2020/02/21
【摘要】 本节书摘来自华章计算机《Kotlin核心编程》 —— 书中第3章,第3.5.2节,作者是水滴技术团队 。

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中的匿名内部类。下面我们就来看看它是如何做的。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。