---
title: No Business Logic In Constructors
impact: HIGH
impactDescription: ensures predictable object initialization and testability
tags: constructor, initialization, side-effects, patterns, quality, kotlin
---

## No Business Logic In Constructors

Constructors should only be used to assign dependencies and initialize simple state. Complex logic, I/O operations, or external system calls in constructors are hard to test, trap errors poorly, and can lead to uninitialized state issues.

**Incorrect (logic in constructor):**

```kotlin
class UserService(configPath: String) {
    private val config: Config

    init {
        // BAD: Blocking I/O in constructor
        val rawConfig = File(configPath).readText()
        this.config = Json.decodeFromString<Config>(rawConfig)
        
        // BAD: Starting threads or network calls
        GlobalScope.launch { 
            initializeExternalSystem()
        }
        
        // BAD: Non-trivial logging
        println("UserService initialized")
    }
}
```

**Correct (Factory pattern or Dependency Injection):**

```kotlin
class UserService(
    private val config: Config,
    private val httpClient: HttpClient
) {
    // Only assignments, no complex logic in init
    
    companion object {
        // Factory method for complex initialization
        suspend fun create(configPath: String): UserService {
            val rawConfig = withContext(Dispatchers.IO) {
                File(configPath).readText()
            }
            val config = Json.decodeFromString<Config>(rawConfig)
            
            val httpClient = HttpClient()
            httpClient.initialize()
            
            return UserService(config, httpClient)
        }
    }
}

// Usage
val service = UserService.create("./config.json")
```

**Recommended Practices:**
- Use `companion object` for factory methods.
- Inject dependencies via constructor.
- Move side effects to dedicated `init()` or `start()` methods called explicitly after object creation.

**Tools:** Static analyzer, detekt, Manual Review
