package i_love_companion_objects import kotlinx.coroutines.* // Extension function on the companion object, easy to discover. Can be suspending. suspend fun SomeInterface.Companion.createWithDefaults(): SomeInterface { return SomeInterfaceOtherImpl( someParameter = pretendToDoSomeWorkAndReturnIt() ) } // Looks like a constructor, but suspends. Could take any parameters, can have overloads. suspend operator fun SomeInterface.Companion.invoke(): SomeInterface { return createWithDefaults() } private suspend fun pretendToDoSomeWorkAndReturnIt(): Any { return delay(timeMillis = 10) } // Implementation is hidden, no need to guess its name. private class SomeInterfaceOtherImpl( private val someParameter: Any ) : SomeInterface { override suspend fun someFunction() { println("FYI: someFunction called in $javaClass having someParameter set to $someParameter") } }