45 lines
1.1 KiB
Markdown
45 lines
1.1 KiB
Markdown
### Kotlin Best Practices
|
|
|
|
#### Code Style
|
|
- Follow Kotlin coding conventions
|
|
- Use `val` over `var` when possible
|
|
- Use data classes for simple data holders
|
|
- Leverage null safety features
|
|
|
|
```kotlin
|
|
// GOOD: Idiomatic Kotlin
|
|
data class User(val id: String, val name: String)
|
|
|
|
class UserService(private val repository: UserRepository) {
|
|
fun findUser(id: String): User? =
|
|
repository.find(id)
|
|
|
|
fun getOrCreateUser(id: String, name: String): User =
|
|
findUser(id) ?: repository.create(User(id, name))
|
|
}
|
|
```
|
|
|
|
#### Null Safety
|
|
- Avoid `!!` (force non-null); use safe calls instead
|
|
- Use `?.let {}` for conditional execution
|
|
- Use Elvis operator `?:` for defaults
|
|
|
|
```kotlin
|
|
// GOOD: Safe null handling
|
|
val userName = user?.name ?: "Unknown"
|
|
user?.let { saveToDatabase(it) }
|
|
|
|
// BAD: Force unwrapping
|
|
val userName = user!!.name // Crash if null
|
|
```
|
|
|
|
#### Coroutines
|
|
- Use structured concurrency with `CoroutineScope`
|
|
- Handle exceptions in coroutines properly
|
|
- Use `withContext` for context switching
|
|
|
|
#### Security
|
|
- Use parameterized queries
|
|
- Validate input at boundaries
|
|
- Use sealed classes for exhaustive error handling
|