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.
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:
public class HashMap<K,V> {
public HashMap(Map<? extends K,? extends V> m);
/** Cria um novo HashMap com a capacidade padrão (16)
* and loadFactor (0.75)
*/
public HashMap();
/** Cria um novo HashMap com um fator de carga padrão (0.75) */
public HashMap(int initialCapacity);
public HashMap(int initialCapacity, float loadFactor);
}
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 HashMap
criem instâncias com os valores padrões de fator de carga e capacidade, que provavelmente são bons para a maioria dos casos.
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:
public class HashMap<K,V> {
public static final int DEFAULT_CAPACITY = 16;
public static final float DEFAULT_LOAD_FACTOR = 0.75;
public HashMap(Map<? extends K,? extends V> m);
/** Cria um novo HashMap com capacidade padrão (16)
* e fator de carga padrão (0.75)
*/
public HashMap();
/** Cria um novo HashMap com um fator de carga padrão (0.75) */
public HashMap(int initialCapacity);
public HashMap(int initialCapacity, float loadFactor);
}
Enquanto isso nos impede de nos repetir, é menos do que expressivo.
Scala adiciona suporte direto para isso:
class HashMap[K,V](initialCapacity:Int = 16, loadFactor:Float = 0.75f) {
}
// Utiliza os valores padrões (16, 0.75f)
val m1 = new HashMap[String,Int]
// Inicial com capacidade 20, e fator de carga padrão
val m2= new HashMap[String,Int](20)
// Sobreescreve ambos os valores
val m3 = new HashMap[String,Int](20,0.8f)
// Sobreescreve somente o fator de carga
// parâmetro nomeado
val m4 = new HashMap[String,Int](loadFactor = 0.8f)
Observe como podemos tirar proveito de qualquer valor padrão usando parâmetros nomeados.
Contributors to this page:
Contents
- Introdução
- Basics
- Tipos Unificados
- Classes
- Parâmetro com Valor Padrão
- Parâmetros Nomeados
- Traits
- Tuplas
- Composição de Classes Mixin
- Funções de ordem superior
- Funções Aninhadas
- Currying
- Classes Case
- Correspondência de Padrões
- Objetos Singleton
- Padrões de Expressões Regulares
- Objetos Extratores
- For Comprehensions
- Classes Genéricas
- Variâncias
- Limitante Superior de Tipos
- Limitante Inferior de Tipos
- Classes Internas
- Tipos Abstratos
- Tipos Compostos
- Auto Referências Explicitamente Tipadas
- Parâmetros Implícitos
- Conversões Implícitas
- Métodos Polimórficos
- Inferência de Tipo Local
- Operadores
- By-name Parameters
- Anotações
- Packages and Imports
- Package Objects