|
| 1 | +--- |
| 2 | +layout: tutorial |
| 3 | +title: Valor Padrão de Parâmetro |
| 4 | + |
| 5 | +disqus: true |
| 6 | + |
| 7 | +tutorial: scala-tour |
| 8 | +num: 32 |
| 9 | +tutorial-next: named-parameters |
| 10 | +tutorial-previous: annotations |
| 11 | +language: pt-br |
| 12 | +--- |
| 13 | + |
| 14 | +Scala provê a capacidade de fornecer parâmetros com valores padrão que podem ser usados para permitir que um usuário possa omitir tais parâmetros se preciso. |
| 15 | + |
| 16 | +Em Java, é comum ver um monte de métodos sobrecarregados que servem apenas para fornecer valores padrão para determinados parâmetros de um método maior. Isso é especialmente verdadeiro com os construtores: |
| 17 | + |
| 18 | +```java |
| 19 | +public class HashMap<K,V> { |
| 20 | + public HashMap(Map<? extends K,? extends V> m); |
| 21 | + /** Cria um novo HashMap com a capacidade padrão (16) |
| 22 | + * and loadFactor (0.75) |
| 23 | + */ |
| 24 | + public HashMap(); |
| 25 | + /** Cria um novo HashMap com um fator de carga padrão (0.75) */ |
| 26 | + public HashMap(int initialCapacity); |
| 27 | + public HashMap(int initialCapacity, float loadFactor); |
| 28 | +} |
| 29 | +``` |
| 30 | + |
| 31 | +Há realmente apenas dois construtores aqui; Um que recebe um map e outro que tem uma capacidade e um fator de carga. O terceiro e o quarto construtores estão lá para permitir que os usuários do <code>HashMap</code> criem instâncias com os valores padrões de fator de carga e capacidade, que provavelmente são bons para a maioria dos casos. |
| 32 | + |
| 33 | +O maior problema é que os valores usados como padrões estão declarados no Javadoc *e* no código. Manter isso atualizado é complicado, pois pode ser esquecido facilmente. Um abordagem típica nesses casos seria adicionar constantes públicas cujos valores aparecerão no Javadoc: |
| 34 | + |
| 35 | +```java |
| 36 | +public class HashMap<K,V> { |
| 37 | + public static final int DEFAULT_CAPACITY = 16; |
| 38 | + public static final float DEFAULT_LOAD_FACTOR = 0.75; |
| 39 | + |
| 40 | + public HashMap(Map<? extends K,? extends V> m); |
| 41 | + /** Cria um novo HashMap com capacidade padrão (16) |
| 42 | + * e fator de carga padrão (0.75) |
| 43 | + */ |
| 44 | + public HashMap(); |
| 45 | + /** Cria um novo HashMap com um fator de carga padrão (0.75) */ |
| 46 | + public HashMap(int initialCapacity); |
| 47 | + public HashMap(int initialCapacity, float loadFactor); |
| 48 | +} |
| 49 | +``` |
| 50 | + |
| 51 | +Enquanto isso nos impede de nos repetir, é menos do que expressivo. |
| 52 | + |
| 53 | +Scala adiciona suporte direto para isso: |
| 54 | + |
| 55 | +```tut |
| 56 | +class HashMap[K,V](initialCapacity:Int = 16, loadFactor:Float = 0.75f) { |
| 57 | +} |
| 58 | +
|
| 59 | +// Utiliza os valores padrões (16, 0.75f) |
| 60 | +val m1 = new HashMap[String,Int] |
| 61 | +
|
| 62 | +// Inicial com capacidade 20, e fator de carga padrão |
| 63 | +val m2= new HashMap[String,Int](20) |
| 64 | +
|
| 65 | +// Sobreescreve ambos os valores |
| 66 | +val m3 = new HashMap[String,Int](20,0.8f) |
| 67 | +
|
| 68 | +// Sobreescreve somente o fator de carga |
| 69 | +// parâmetro nomeado |
| 70 | +val m4 = new HashMap[String,Int](loadFactor = 0.8f) |
| 71 | +``` |
| 72 | + |
| 73 | +Observe como podemos tirar proveito de *qualquer* valor padrão usando [parâmetros nomeados](named-parameters.html). |
| 74 | + |
0 commit comments