|
| 1 | +--- |
| 2 | +layout: tutorial |
| 3 | +title: Anotações |
| 4 | + |
| 5 | +disqus: true |
| 6 | + |
| 7 | +tutorial: scala-tour |
| 8 | +num: 31 |
| 9 | +tutorial-next: default-parameter-values |
| 10 | +tutorial-previous: automatic-closures |
| 11 | +language: pt-br |
| 12 | +--- |
| 13 | + |
| 14 | +Anotações associam meta-informação com definições. |
| 15 | + |
| 16 | +Uma cláusula de anotação simples tem a forma `@C` ou `@C(a1,..., an)`. Aqui, `C` é um construtor de uma classe `C`, que deve estar em conformidade com a classe `scala.Annotation`. Todos os argumentos de construtor fornecidos `a1, .., an` devem ser expressões constantes (isto é, expressões em literais numéricos, strings, literais de classes, enumerações Java e matrizes uni-dimensionais). |
| 17 | + |
| 18 | +Uma cláusula de anotação se aplica à primeira definição ou declaração que a segue. Mais de uma cláusula de anotação pode preceder uma definição e uma declaração. Não importa a ordem em que essas cláusulas são declaradas. |
| 19 | + |
| 20 | +O significado das cláusulas de anotação é _dependente da implementação_. Na plataforma Java, as seguintes anotações Scala têm um significado padrão. |
| 21 | + |
| 22 | +| Scala | Java | |
| 23 | +| ------ | ------ | |
| 24 | +| [`scala.SerialVersionUID`](http://www.scala-lang.org/api/2.9.1/scala/SerialVersionUID.html) | [`serialVersionUID`](http://java.sun.com/j2se/1.5.0/docs/api/java/io/Serializable.html#navbar_bottom) (field) | |
| 25 | +| [`scala.cloneable`](http://www.scala-lang.org/api/2.9.1/scala/cloneable.html) | [`java.lang.Cloneable`](http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Cloneable.html) | |
| 26 | +| [`scala.deprecated`](http://www.scala-lang.org/api/2.9.1/scala/deprecated.html) | [`java.lang.Deprecated`](http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Deprecated.html) | |
| 27 | +| [`scala.inline`](http://www.scala-lang.org/api/2.9.1/scala/inline.html) (desde 2.6.0) | não há equivalente | |
| 28 | +| [`scala.native`](http://www.scala-lang.org/api/2.9.1/scala/native.html) (desde 2.6.0) | [`native`](http://java.sun.com/docs/books/tutorial/java/nutsandbolts/_keywords.html) (keyword) | |
| 29 | +| [`scala.remote`](http://www.scala-lang.org/api/2.9.1/scala/remote.html) | [`java.rmi.Remote`](http://java.sun.com/j2se/1.5.0/docs/api/java/rmi/Remote.html) | |
| 30 | +| [`scala.serializable`](http://www.scala-lang.org/api/2.9.1/index.html#scala.annotation.serializable) | [`java.io.Serializable`](http://java.sun.com/j2se/1.5.0/docs/api/java/io/Serializable.html) | |
| 31 | +| [`scala.throws`](http://www.scala-lang.org/api/2.9.1/scala/throws.html) | [`throws`](http://java.sun.com/docs/books/tutorial/java/nutsandbolts/_keywords.html) (keyword) | |
| 32 | +| [`scala.transient`](http://www.scala-lang.org/api/2.9.1/scala/transient.html) | [`transient`](http://java.sun.com/docs/books/tutorial/java/nutsandbolts/_keywords.html) (keyword) | |
| 33 | +| [`scala.unchecked`](http://www.scala-lang.org/api/2.9.1/scala/unchecked.html) (since 2.4.0) | não há equivalente | |
| 34 | +| [`scala.volatile`](http://www.scala-lang.org/api/2.9.1/scala/volatile.html) | [`volatile`](http://java.sun.com/docs/books/tutorial/java/nutsandbolts/_keywords.html) (keyword) | |
| 35 | +| [`scala.reflect.BeanProperty`](http://www.scala-lang.org/api/2.9.1/scala/reflect/BeanProperty.html) | [`Design pattern`](http://docs.oracle.com/javase/tutorial/javabeans/writing/properties.html) | |
| 36 | + |
| 37 | +No exemplo a seguir, adicionamos a anotação `throws` à definição do método `read` para capturar a exceção lançada no código Java. |
| 38 | + |
| 39 | +> Um compilador Java verifica se um programa contém manipuladores para [exceções verificadas](http://docs.oracle.com/javase/specs/jls/se5.0/html/exceptions.html) analisando quais exceções verificadas podem resultar da execução de um método ou construtor. Para cada exceção verificada que é um resultado possível, a cláusula **throws** para o método ou construtor _deve_ mencionar a classe dessa exceção ou uma das superclasses da classe dessa exceção. |
| 40 | +> Como Scala não tem exceções verificadas, os métodos Scala _devem_ ser anotados com uma ou mais anotações `throws`, de forma que o código Java possa capturar exceções lançadas por um método Scala. |
| 41 | +
|
| 42 | + |
| 43 | +Exemplo de classe Scala que lança uma exceção do tipo `IOException`: |
| 44 | + |
| 45 | +``` |
| 46 | +package examples |
| 47 | +import java.io._ |
| 48 | +class Reader(fname: String) { |
| 49 | + private val in = new BufferedReader(new FileReader(fname)) |
| 50 | + @throws(classOf[IOException]) |
| 51 | + def read() = in.read() |
| 52 | +} |
| 53 | +``` |
| 54 | + |
| 55 | +O programa Java a seguir imprime o conteúdo do arquivo cujo nome é passado como o primeiro argumento para o método `main`. |
| 56 | + |
| 57 | +``` |
| 58 | +package test; |
| 59 | +import examples.Reader; // Classe Scala acima declarada!! |
| 60 | +public class AnnotaTest { |
| 61 | + public static void main(String[] args) { |
| 62 | + try { |
| 63 | + Reader in = new Reader(args[0]); |
| 64 | + int c; |
| 65 | + while ((c = in.read()) != -1) { |
| 66 | + System.out.print((char) c); |
| 67 | + } |
| 68 | + } catch (java.io.IOException e) { |
| 69 | + System.out.println(e.getMessage()); |
| 70 | + } |
| 71 | + } |
| 72 | +} |
| 73 | +``` |
| 74 | + |
| 75 | +Comentando-se a anotação `throws` na classe `Reader` o compilador produz a seguinte mensagem de erro ao compilar o programa principal Java: |
| 76 | + |
| 77 | +``` |
| 78 | +Main.java:11: exception java.io.IOException is never thrown in body of |
| 79 | +corresponding try statement |
| 80 | + } catch (java.io.IOException e) { |
| 81 | + ^ |
| 82 | +1 error |
| 83 | +``` |
| 84 | + |
| 85 | +### Anotações Java ### |
| 86 | + |
| 87 | +**Nota:** Certifique-se de usar a opção `-target: jvm-1.5` com anotações Java. |
| 88 | + |
| 89 | +Java 1.5 introduziu metadados definidos pelo usuário na forma de [anotações](http://java.sun.com/j2se/1.5.0/docs/guide/language/annotations.html). Uma característica chave das anotações é que elas dependem da especificação de pares no formato nome-valor para inicializar seus elementos. Por exemplo, se precisamos de uma anotação para rastrear a origem de alguma classe, podemos defini-la como: |
| 90 | + |
| 91 | +``` |
| 92 | +@interface Source { |
| 93 | + public String URL(); |
| 94 | + public String mail(); |
| 95 | +} |
| 96 | +``` |
| 97 | + |
| 98 | +O uso da anotação Source fica da seguinte forma |
| 99 | + |
| 100 | +``` |
| 101 | +@Source(URL = "http://coders.com/", |
| 102 | + mail = "support@coders.com") |
| 103 | +public class MyClass extends HisClass ... |
| 104 | +``` |
| 105 | + |
| 106 | +A uso de anotações em Scala parece uma invocação de construtor, para instanciar uma anotação Java é preciso usar argumentos nomeados: |
| 107 | + |
| 108 | +``` |
| 109 | +@Source(URL = "http://coders.com/", |
| 110 | + mail = "support@coders.com") |
| 111 | +class MyScalaClass ... |
| 112 | +``` |
| 113 | + |
| 114 | +Esta sintaxe é bastante tediosa, se a anotação contiver apenas um parâmetro (sem valor padrão), por convenção, se o nome for especificado como `value`, ele pode ser aplicado em Java usando uma sintaxe semelhante a Scala, ou seja parecido com a invocação de um construtor: |
| 115 | + |
| 116 | +``` |
| 117 | +@interface SourceURL { |
| 118 | + public String value(); |
| 119 | + public String mail() default ""; |
| 120 | +} |
| 121 | +``` |
| 122 | + |
| 123 | +O uso da anotação SourceURL fica da seguinte forma |
| 124 | + |
| 125 | +``` |
| 126 | +@SourceURL("http://coders.com/") |
| 127 | +public class MyClass extends HisClass ... |
| 128 | +``` |
| 129 | + |
| 130 | +Neste caso, a Scala oferece a mesma possibilidade |
| 131 | + |
| 132 | +``` |
| 133 | +@SourceURL("http://coders.com/") |
| 134 | +class MyScalaClass ... |
| 135 | +``` |
| 136 | + |
| 137 | +O elemento `mail` foi especificado com um valor padrão, portanto não precisamos fornecer explicitamente um valor para ele. No entanto, se precisarmos fazer isso, não podemos misturar e combinar os dois estilos em Java: |
| 138 | + |
| 139 | +``` |
| 140 | +@SourceURL(value = "http://coders.com/", |
| 141 | + mail = "support@coders.com") |
| 142 | +public class MyClass extends HisClass ... |
| 143 | +``` |
| 144 | + |
| 145 | +Scala proporciona mais flexibilidade a respeito disso: |
| 146 | + |
| 147 | +``` |
| 148 | +@SourceURL("http://coders.com/", |
| 149 | + mail = "support@coders.com") |
| 150 | + class MyScalaClass ... |
| 151 | +``` |
0 commit comments