Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Use Companion object in kotlin android is a good practice?

Tags:

android

kotlin

I have ever used Java to programming in android, but a few weeks ago I started to learn kotlin, when I use Java I tried to use object oriented approach and use the less possible static objects or instances, so when I see some materials in internet about some implementations of consume web services in kotlin I see something like this:

/*call of method from activity*/
val message = WebServiceTask.getWebservice(getString(R.string.url_service))

/*Class to do the call to webservice*/
class WebServiceTask {
    companion object {
        fun getWebService(url: String): WebServiceResponse {
            val call =
                RetrofitInstance.getRetrofit(url).create(ApiService::class.java).getList()
                    .execute()
            val webServiceResponse = call.body() as WebServiceResponse
            return user
        }
    }
}
/*Class to get Retrofit instance*/
class RetrofitInstance {
    companion object{
        fun getRetrofit(url: String): Retrofit {
            return Retrofit.Builder()
                .baseUrl(url)
                .addConverterFactory(GsonConverterFactory.create())
                .build()
        }

    }
} 

Like you see i use companion object in two classes and according to i read companion object is equivalent to static instance in java, so my question is: is this code following object oriented programming?, this aproach is recommended?, in case that answer is no and which is the best implementation for this code in object oriented

like image 970
Luis Enrique Zepeda Avatar asked Jan 01 '23 10:01

Luis Enrique Zepeda


1 Answers

Yes, companion object is Kotlin's equivalent of static members in Java. Everything that applies to static, applies to companion object as well.

The use of companion object depends on how it interacts with the state of class's object.

If you are using some methods which are totally Pure functions Or Some final values which you need to provide access to outside the class itself, in that case using companion object makes total sense.

It is recommended for the above conditions because it does not interfere with the state of the class's object.

So, for the given code snippet it is a valid use of companion object.

Observe that methods inside companion object do not interact with something which is not passed to them as parameters. Everything that you see is created/initialized or used inside the methods only, Just the result it gets out.

Note: However, if your companion object members(values or functions) interfere with the state of the object, it will cause leaks, which will lead you to troubles you have never faced before.

like image 188
Harshvardhan Joshi Avatar answered Jan 04 '23 17:01

Harshvardhan Joshi