Luis Enrique Zepeda
Luis Enrique Zepeda

Reputation: 61

Use Companion object in kotlin android is a good practice?

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

Upvotes: 5

Views: 12750

Answers (2)

Harshvardhan Joshi
Harshvardhan Joshi

Reputation: 3193

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.

Upvotes: 10

Anton Malyshev
Anton Malyshev

Reputation: 8861

Yes, it is equivalent to static. No, it is not recommended, as it leads to problems with mocking for testing, for example.

Upvotes: 3

Related Questions