Better

业精于勤荒于嬉

Idiomatic Kotlin: object and Signleton

Better's Avatar 2019-06-08 Kotlin

  1. 1. Define and use
  2. 2. bummock
  3. 3. Considerations and Limitations
  4. 4. other
  5. 5. 参考

单列模式限制了一个类只能有一个实例。当全局条件下,只需要一个实例来控制状态的时候就很有必要。
单列必须要求:

  • 只能有一个实例
  • 能够被其他的访问

在实现方式上来说:

  • 私有的构造方法,确保其他地方不能生产实例。
  • 通过一个静态的方法来访问这个唯一的实例
  • 确保线程安全

在 kotlin 中可以通过object关键字来实现类型的定义、唯一实例的初始化。

Define and use

object后面跟谁类名,这样就申明的单列

1
2
3
object Signleton {
val name ="hello"
}

bummock

查看编译后的 Java 代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public final class Signleton {
@NotNull
private static final String name = "hello";
public static final Signleton INSTANCE;

@NotNull
public final String getName() {
return name;
}

private Signleton() {
}

static {
Signleton var0 = new Signleton();
INSTANCE = var0;
name = "hello";
}
}

实现方式是通过申明私有的静态变量,然后在静态代码块中对其初始化。
在Java 中静态代码块是在类被加载的时候进行初始化。类被加载是因为是其被其他类引用到了,类只会被加载一次。这样就保证了实例的唯一,也保证了线程安全,在并发的时候并不会创建多个实例。

Considerations and Limitations

对象声明不能在局部作用域(即直接嵌套在函数内部),但是它们可以嵌套到其他对象声明或非内部类中
object类不能有构造函数。所以在一些注解框架中,将变得不是很实用,注解框架需要使用构造函数。这样就只能回退到普通类的方式来实现单列(通过类和伴生对象)。

Singleton pattern and object is therefore only good for instances with little to no dependencies. On large software projects with large dependencies, it is arguably better to employ dependency injection for scoping and lifecycle management of regular classes instead.

other

限制 restrict
The singleton pattern restricts the instantiation of a class to a single object.

参考

kotlinDoc-object
Idomatic kotlin:object and signleton

This article was last updated on days ago, and the information described in the article may have changed.