在kotlin中重新创建对象

我有一个简单的问题:需要重新创建一个对象与其他参数。 有这个对象:

object NetworkClient { var BASE_URL = "http://google.ru" //we can take this from another class or Pref's const val API_BASE_URL = "$BASE_URL/api/" val httpClient = OkHttpClient.Builder() val client: Client var retrofit: Retrofit init { val builder = Retrofit.Builder() .baseUrl(API_BASE_URL) .addConverterFactory(GsonConverterFactory.create()) retrofit = builder.client(httpClient.build()).build() client = retrofit.create(Client::class.java) } } 

在极少数情况下,您需要将BASE_URL动态更改为另一个字符串并重新创建客户端等。我知道如何做到这一点,但是我的解决方案非常辛苦 – 需要重新使用此类的所有地方,但是我希望创建此对象具体参数。 你如何看待这个问题?

您需要为此创建一个单独的类,因为singleton(Kotlin中的object )不能有一个构造函数:

 class NetworkClient(val baseUrl: String) { const val API_BASE_URL = "$baseUrl/api/" val httpClient = OkHttpClient.Builder() val client: Client var retrofit: Retrofit init { // ... } } 

使用一个object来使当前的网络客户端实例在手边:

 object NetworkClientProvider { var networkClient = NetworkClient("http://google.ru") } 

用法,如果您需要创建一个新的NetworkClient

 NetworkClientProvider.networkClient = NetworkClient("http://someOtherDomain.com") 

你在这里滥用object 。 如果你真的有一个类的单个实例,应该使用它,这是应用Singleton模式的Kotlin内置function。

通过使它成为一个普通的类来修复它:

 class NetworkClient(val baseurl: String) { const val API_BASE_URL = "$baseurl/api/" val httpClient = OkHttpClient.Builder() //... } 

然后可以创建具有不同基baseurl的对象,如下所示:

 val russian = NetworkClient("http://google.ru") val com = NetworkClient("http://google.com")