Por qué y cuándo usar @JvmStatic en companion objects de Kotlin
¡Hola a todos! Empecé a aprender Kotlin y estoy reescribiendo un proyecto Java antiguo. Me encontré con una situación confusa con los companion objects.
Tengo este código en Kotlin:
```kotlin
class MyUtils {
companion object {
fun formatDate(date: Date): String {
// formateo de fecha
return SimpleDateFormat("yyyy-MM-dd", Locale.US).format(date)
}
const val MAX_COUNT = 100
}
}
```
Desde código Java intento llamar a este método así:
```java
String formatted = MyUtils.formatDate(new Date());
```
¡Pero el compilador da un error! Tengo que escribir `MyUtils.Companion.formatDate(...)`, que se ve horrible. Leí sobre la anotación `@JvmStatic`, pero no entiendo completamente:
1. ¿Por qué Kotlin se comporta así? En Java podía simplemente llamar a un método estático de la clase.
2. ¿Cuándo exactamente se debe agregar `@JvmStatic`? ¿Es siempre necesario para companion objects?
3. ¿Hay diferencia entre `@JvmStatic` y `@JvmField` para constantes?
Explíquenme, por favor.