:?: Observando o Código abaixo, se executado você obtem:343 341 340, todavia existem uma má pratica conhecida como sombreamento.Então o que poderia ser evitado em termos programáticos usando uma melhor prática de desenvolvimento.
:shock: O que acontece ?
class Ruby{
static final long grails=343L;
static long doIt(long grails){
System.out.print(++grails+" ");
return ++grails;
}
public static void main(String[] args){
System.out.print(grails+"");
final long grails = 340L;
new Ruby().doIt(grails);
System.out.println(grails);
}
}
Para evitar sombreamento, você pode usar uma convenção para nomes de parâmetros e variáveis.
Isso não é muito coerente com a filosofia Java, mas pode ser usado na prática.
Eu, por exemplo, sempre começo meus parâmetros por “p” e uso nomes decentes para variáveis, em vez de repetir nomes dos membros da própria classe.
Outro quebra-galho é ficar usando “this.” a torto e a direito, o que eu acho meio smalltalkiano pro meu gosto.
// Evitando o sombreamento usando uma convenção para nomes de parâmetros
private int tamanho;
public void setTamanho (final int pTamanho) {
tamanho = pTamanho;
}
// Evitando o sombreamento usando "this" (todos usam mas acho meio gambiarresco)
public void setTamanho (final int tamanho) {
this.tamanho = tamanho;
}
para evitar o sombreando… basta usar boas praticas… pq vc daria o nome de uma variavel “nota” para tudo? caso tivesse fazendo um boletim? nao é melhor vc criar notaMat por exemplo? e sombreamento dar um trabalho desde do desenvolvimento imagine na manutenção?
[quote=Marcio Duran] :?: Observando o Código abaixo, se executado você obtem:343 341 340, todavia existem uma má pratica conhecida como sombreamento.Então o que poderia ser evitado em termos programáticos usando uma melhor prática de desenvolvimento.
[/quote]
Sombreamento não é uma má prática é um dos mecanismos de polimorfismo.
Então nada deveria ser feito para evitar sobreamento.
Agora, se vc está inadevertidamente usando sombreamento e não é isso que quer, então, mude os nomes das variáveis ou use this. Ao contrario do que o thingol falou e eu acho muito mais prático usar o mesmo nome e usar o this. Isto porque o codigo fica mais claro e não é necessidade de nenhum tipo de convensão (uma que é particularmente feia é a de usar _ antes dos nomes dos atributos). Também não se devem usar abreviaturas.
A simplicidade dos nomes das suas variáveis torna o codigo mais legivel, isso o torna mais eficaz e diminui a necessidade de comentarios.
Eu diria que você se aproximou , mas o thingol fez uma observação genérica.
:arrow: No exposto acima ao exemplo citado, onde você apontaria o efeito de shadowing 8)
:idea: Observação:this representa o objeto sobre o qual esta sendo aplicado um método.this só pode ser usado no corpo de metodos que não são estáticos ou nos contrutores.
:!:[size=18] this[/size] é usado em situações onde pode ocorrer ambiguidade, entre nome de um membro e o nome de um parâmetro formal, variável, etc…
:arrow: Existe três variáveis long diferentes chamadas grails.Entende-se que você pode aplicar o modificador final a variáveis locais, mas neste caso as duas versão de grails marcadas como final não são modificadas.O único grails cujo o valor se modifica é o que não está marcado com final.
:idea: Em vista de outros casos de shadowing, fica ai essa explicação para este exposto.
assim cara eu nao consigo, eu ver dando manutencao em um codigo com sombreamento imagine ai 400 linhas de codigo usando sombreamento é coisa de doido…idenpendente do modificador que vc utilizar…
:!: Objetivo era apontar o efeito de shadowing.A explicação por idéias ou simbolizar com outros exemplo não objetivaram o que na verdade o exposto tinha por objetivo o entendimento do assunto.Não recomendo tal prática ou contexto baseado nesse cenário.
:idea: Passando variáveis para os métodos
Dica: Os métodos podem usar tipos primitivos e / ou referência a objetos como argumentos.
então a sua solução é usar final ? LOL
Não se engane. A forma de evitar sobreamento é realmene usar outros nomes (ou usar this).
Entenda que nem sempre é possivel ter variáveis final e pior , vc se confundirá sobre quais têm que ser final.
[quote]
então a sua solução é usar final ? LOL
Não se engane. A forma de evitar sobreamento é realmene usar outros nomes (ou usar this).
Entenda que nem sempre é possivel ter variáveis final e pior , vc se confundirá sobre quais têm que ser final.[/quote]
sergiotaborda
Virtual Machine Man
:arrow: Sombreamento não é uma má prática é um dos mecanismos de polimorfismo.
Então nada deveria ser feito para evitar sobreamento.
:thumbup: A intenção foi mostrar uma observação sobre shadowing “O único grails cujo o valor se modifica é que não esta marcado com final”, sobre o que é a prática ao desenvolvimento concordo com suas observações, todavia chamei atenção para um outro sentido sobre sombreamento.