Kotlin中的Singleton类在Kotlin中也称为Singleton对象。 Singleton类是这样定义的类,即该类的一个实例只能在任何地方创建和使用。很多时候,我们创建同一类的两个不同的对象,但是我们必须记住,创建两个不同的对象还需要为这些对象分配两个不同的内存。因此,最好制作一个对象并一次又一次地使用它。
Kotlin
// Kotlin program
fun main(args: Array)
{
val obj1 = GFG()
val obj2 = GFG()
println(obj1.toString())
println(obj2.toString())
}
class GFG
{
}
Kotlin
// Kotlin program
fun main(args: Array)
{
println(GFG.toString())
println(GFG.toString())
}
// GFG is the singleton class here
object GFG
{
}
Kotlin
// Kotlin program
fun main(args: Array)
{
println(GFG.name)
println("The answer of addition is ${GFG.add(3,2)}")
println("The answer of addition is ${GFG.add(10,15)}")
}
object GFG
{
init
{
println("Singleton class invoked.")
}
var name = "GFG Is Best"
fun add(num1:Int,num2:Int):Int
{
return num1.plus(num2)
}
}
Kotlin
// sample android application program in kotlin
// showing use of singleton object
package com.example.retrofitexample
import retrofit2.Call
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import retrofit2.http.GET
import retrofit2.http.Query
const val BASE_URL = "https://newsapi.org/"
const val API_KEY = "ff30357667f94aca9793cc35b9e447c1"
interface NewsInterface
{
@GET("v2/top-headlines?apiKey=$API_KEY")
fun getheadlines(@Query("country")country:String,@Query("page")page:Int):Call
// function used to get the headlines of the country according to the query
// written by developer
}
// NewsService is the instance of retrofit made by using Singleton object
object NewsService
{
val newsInstance:NewsInterface
init {
val retrofit=Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build()
newsInstance=retrofit.create(NewsInterface::class.java)
}
}
输出:
在上面的示例中,我们可以看到两个对象都有不同的地址,因此这是内存的浪费。在下面的程序中,我们做了同样的事情,但是我们使用了singleton类。
科特林
// Kotlin program
fun main(args: Array)
{
println(GFG.toString())
println(GFG.toString())
}
// GFG is the singleton class here
object GFG
{
}
输出:
因此,当我们使用对象而不是类时,Kotlin实际上使用Singelton并分配单个内存。在Java,将一个singleton类制成了一个名为Singleton的类。但是在Kotlin中,我们需要使用object关键字。对象类可以具有函数,属性和init方法。不允许在对象中使用构造函数方法,因此如果需要一些初始化并且可以在类内定义对象,则可以使用init方法。我们使用类名调用单例类中存在的方法和成员变量,就像在伴随对象中一样。
科特林
// Kotlin program
fun main(args: Array)
{
println(GFG.name)
println("The answer of addition is ${GFG.add(3,2)}")
println("The answer of addition is ${GFG.add(10,15)}")
}
object GFG
{
init
{
println("Singleton class invoked.")
}
var name = "GFG Is Best"
fun add(num1:Int,num2:Int):Int
{
return num1.plus(num2)
}
}
输出:
单例类的属性
以下是典型的单例类的属性:
- 仅一个实例:单例类只有一个实例,这是通过在类中提供该类的一个实例来完成的。
- 全局可访问性:单例类的实例应该是全局可访问的,以便每个类都可以使用它。
- 不允许使用构造函数:我们可以使用init方法初始化成员变量。
Android中Singleton对象的重要性
以下是一些要点,这些要点说明了单例对象在android中的重要性以及一些示例(必须在其中使用),以及为什么android开发人员应了解单例对象的原因。
- 众所周知,当我们想要整个应用程序中特定对象的单个实例时,我们将使用Singleton。使用单例的常见用例是在整个应用程序中对每个单个请求使用Retrofit时,在这种情况下,您只需要一个单独的改造实例,因为改造实例包含一些附加到其上的属性。就像Gson Converter(用于将JSON响应转换为Java Objects)和Moshy Converter一样,因此您想要重用该实例并一次又一次创建一个新实例将浪费时间和空间,因此在这种情况下,我们必须使用单例对象。
- 考虑在MVVM体系结构中使用存储库时的情况,因此在这种情况下,由于存储库不会更改,因此您仅应创建一个存储库实例,并且创建不同的实例将导致空间增加和时间浪费。
- 假设您有一个应用程序,并且用户可以在经过用户身份验证后登录到该应用程序,因此,如果同时有两个具有相同名称和密码的用户尝试登录到该帐户,则由于担心安全问题,该应用程序不应允许。因此,单例对象在这里仅帮助我们创建该对象的一个实例(即用户),因此无法进行多次登录。希望这些示例足以使读者满意,以进一步了解Kotlin中的单例对象,以便他们可以在自己的android项目中使用单例对象。
示例Android程序显示了Singleton对象的使用:
科特林
// sample android application program in kotlin
// showing use of singleton object
package com.example.retrofitexample
import retrofit2.Call
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import retrofit2.http.GET
import retrofit2.http.Query
const val BASE_URL = "https://newsapi.org/"
const val API_KEY = "ff30357667f94aca9793cc35b9e447c1"
interface NewsInterface
{
@GET("v2/top-headlines?apiKey=$API_KEY")
fun getheadlines(@Query("country")country:String,@Query("page")page:Int):Call
// function used to get the headlines of the country according to the query
// written by developer
}
// NewsService is the instance of retrofit made by using Singleton object
object NewsService
{
val newsInstance:NewsInterface
init {
val retrofit=Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build()
newsInstance=retrofit.create(NewsInterface::class.java)
}
}
想要一个节奏更快,更具竞争性的环境来学习Android的基础知识吗?
单击此处,前往由我们的专家精心策划的指南,以使您立即做好行业准备!