Como gerenciar o escopo da variável em Java
O escopo se refere à área de acessibilidade de uma variável. Ele determina onde uma variável declarada pode ser usada. Tentar usar uma variável fora de seu escopo resultará em um erro de tempo de compilação.
Como regra geral, você deve sempre usar o princípio do menor privilégio ao determinar o escopo para fornecer uma variável. De acordo com esse princípio, uma variável deve ter apenas a visibilidade necessária para realizar seu trabalho e nada mais.
Regras de Escopo
Existem quatro regras básicas que regem o âmbito das declarações.
Regra 1
Quando você declara um parâmetro, seu escopo está dentro do corpo da função.
String withdraw (int amount){
// this is the scope of the parameter "amount" ie from the left brace ,{, to the the right one, }
}
Regra 2
O escopo de uma variável declarada em uma função é da parte onde ela é declarada até o final do corpo da função. Este tipo de variável declarada dentro do corpo de uma função é chamada de variável local. Portanto, essa variável tem escopo local.
String withdraw (int amount){
String currency;
int transaction_fee = 2; // this is a local variable and it's scope begins from here till the right brace, }
}
Regra 3
Uma variável declarada no cabeçalho de uma instrução for também tem escopo local.
for ( int y=11;y <20; y++){
// variable y has local scope
}
Neste ponto, é importante mencionar que você obterá um erro em tempo de compilação se seu método tiver duas variáveis locais com o mesmo nome.
Regra 4
O escopo de um método ou campo de uma classe é todo o corpo da classe. Isso permite que os métodos de instância de uma classe possam usar os métodos ou campos da classe.
Veja o exemplo abaixo. É uma implementação de código totalmente funcional das regras acima. Você pode compilá-lo e executá-lo em seu PC.
class Account {
int y = 2; // class field
static void withdraw(int amount){
String z;
for(int y=1; y<=3; y++){ // line 7
System.out.println("
Remember to hide your PIN.");}
}
public static void main(String args[]){
withdraw(50); }
}
Observe o campo de classe e o código na linha 7. Se você declarar um parâmetro ou variável local usando um nome semelhante ao usado por um dos campos de classe, a execução continuará normalmente e sem erros. Isso é conhecido como sombreamento.
No exemplo acima, a variável y é declarada duas vezes e ainda assim o compilador não sinaliza nenhum erro. O compilador primeiro "esconde" os campos da classe até que o bloco seja executado.
Às vezes, você pode precisar acessar um campo sombreado no bloco. Isso pode ser feito de duas maneiras:
a) Você pode usar a palavra – chave this se estiver lidando com uma variável de instância. Veja o exemplo abaixo:
this.x : x é uma variável de instância
b) Se a variável que você está tentando acessar é uma variável de classe estática , use a sintaxe abaixo para acessá-la:
ClassName.x // x is a static variable
Escopo da classe
Normalmente, cada objeto tem suas próprias variáveis de instância. Existem cenários em que você precisa da mesma cópia da variável compartilhada com todas as instâncias. Nesse caso, você precisará torná-los estáticos.
Os membros da classe definidos com a palavra-chave static têm escopo de classe. Portanto, as variáveis estáticas têm escopo de classe. Eles podem ser acessados por todos os métodos da classe. Para acessar as variáveis estáticas públicas de uma classe, use:
ClassName.variable_name
Por outro lado, as variáveis estáticas privadas de uma classe só podem ser acessadas pelos métodos da classe.
Obtenha classes e construtores em seu escopo
Às vezes, você pode exigir uma variável que, quando acessada após a inicialização, não é modificada. Caso seja necessário, use a palavra-chave final . Basta colocá-lo antes da variável que você está declarando para usá-lo.
final double PI = 3.14159;
Tentar modificar uma variável declarada como final irá gerar um erro em tempo de compilação. Também é importante que você saiba que deve inicializar imediatamente uma variável final . Você não pode escolher inicializá-lo mais tarde.
Neste ponto, você deve estar olhando para aprender construtores e classes em Java.