在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")
- 为什么我的RxJava设置阻止我的UI线程? 使用BluetoothAdapter.startLeScan回调
- 为什么json字符串为空时,我将一个内部对象传递给Gson()。toJson(object)in Kotlin?
- Android工作室插件ID:’kotlin-android-extensions’
- 如何在RxJava2中错误地终止开关图的序列
- 未解决的参考DaggerApplicationComponent
- Android kotlin扩展错误
- 安卓Braintree,贝宝不工作
- kotlin todo-mvp使用framents
- Kotlin – 在view.getTag()上的TypeCastException