¿Qué son las anotaciones de metadatos?
Empiezan con @ y adjuntan información estática adicional al código. Son leídas por el compilador, el IDE y el analizador estático, sin afectar la lógica de ejecución.
Dos formatos válidos:
- Constantes integradas de tiempo de compilación:
@override,@deprecated - Llamadas a constructores constantes:
@Deprecated("Texto de aviso"), anotaciones personalizadas como@Todo("xxx", "xxx")
Se usan habitualmente en clases, métodos, variables, funciones, parámetros, importaciones, enumeraciones, etc.
@Deprecated
Marca una API obsoleta. Es obligatorio indicar la alternativa y la fecha de eliminación. También cuenta con métodos estáticos para limitar escenarios específicos.
class Television {
/// Alternativa: usa turnOn
@Deprecated('Utiliza turnOn() en su lugar. Este método se eliminará a finales de 2026')
void activate() {
turnOn();
}
void turnOn() {
print("Televisor encendido");
}
}
// Ejemplos de restricciones de obsolescencia específicas
@Deprecated.instantiate() // Prohíbe instanciar esta clase con new
class OldDevice {}
@Deprecated.extend() // Prohíbe que otras clases hereden de esta
class Base {}
// Intentar heredar de Base genera una advertencia de obsolescencia en el editor
class Sub extends Base {}
void main() {
Television tv = Television();
// Al llamar al método marcado con @Deprecated, el IDE muestra tachado y advertencias
tv.activate();
// Método nuevo recomendado
tv.turnOn();
// Instanciar OldDevice activa la advertencia de @Deprecated.instantiate()
OldDevice device = OldDevice();
}
Lenguaje del código: Dart (dart)
El código anterior se compila y ejecuta sin problemas, solo aparecen advertencias en el IDE y el compilador. Puedes probarlo con Android Studio o IntelliJ IDEA.
@deprecated
Sin mensaje personalizado, solo marca simple obsolescencia. Se recomienda preferir @Deprecated("Descripción")
@deprecated
void oldFunc() {}
Lenguaje del código: Dart (dart)
@override
Marca miembros que sobrescriben elementos con el mismo nombre de la superclase o interfaz. El IDE realiza comprobaciones: si escribes mal el nombre del método aparecerá un error rojo.
class Animal {
void speak() {}
}
class Dog extends Animal {
// @override indica sobrescritura del método speak de la clase padre
@override
void speak() {
print("Guau");
}
}
class Cat extends Animal {
@override
void speak() {
print("Miau");
}
}
class Pig extends Animal {
// Sin sobrescritura
}
void main() {
Animal dog = Dog();
Animal cat = Cat();
Animal pig = Pig();
dog.speak(); // Salida: Guau
cat.speak(); // Salida: Miau
pig.speak();
}
Lenguaje del código: Dart (dart)
@pragma
Envía instrucciones de optimización de bajo nivel o reconocimiento al compilador y analizador estático, usadas principalmente en desarrollo de bajo nivel.
// Ejemplo: Indicar al compilador que inlinee esta función
@pragma('vm:prefer-inline')
int add(int a, int b) => a + b;
Lenguaje del código: Dart (dart)