escopo variável
cada variável só está disponível (e acessível) no contexto em que foi declarada. Para determinar o contexto, consulte as marcas de abertura e fechamento mais próximas que rodeiam a declaração. A maioria das linguagens de programação usa Chavetas ({}
) para marcar o início e o fim de um bloco de código. Veja este exemplo:
não é necessário entender todos os bits de código aqui; concentre-se apenas no chavetas. 🙂 Quando falamos sobre a disponibilidade de uma variável dentro de um contexto, estamos nos referindo ao escopo. Aqui, você pode ver que a variável root
foi declarada entre os dois suspensórios encaracolados em roxo. O alcance dessa variável é tudo entre esses dois aparelhos.
O escopo de uma variável pode ser local, bem como global, Dependendo de onde uma variável é declarada. Uma variável global pode estar disponível para todas as classes e métodos dentro de um programa enquanto uma variável local podem estar disponíveis apenas dentro do método que ela é declarada em:
Aqui, expandimos o código um pouco e estendeu o nosso primeiro bloco de código para incluir um outro! Se você rastrear as linhas roxas, você pode ver que os suportes do primeiro bloco englobam todo o código a partir do segundo. Em seguida, você pode ver que uma nova variável, spy
, foi declarada dentro do escopo local verde.
Uma vez que a variávelroot
foi declarada no âmbito global, isso significa que é acessível a tudo dentro dos parênteses roxos, incluindo tudo o que é declarado no âmbito local. No segundo bloco de código, você pode ver uma linha logo abaixo da declaração da variável spy que usa root
. Isso é permitido!
no entanto, o que quer que esteja no âmbito local não está disponível para o âmbito global, ou quaisquer outros blocos locais de código. Vamos dar uma olhada em outro exemplo:
Aqui nós adicionamos mais um bloco de código, que tem seu próprio escopo local e sua própria variável, anotherSpy
. Agora, confira a última linha em nosso bloco de variáveis espião:
System.out.println(anotherSpy); // Error
parece que há um erro! Isso porque está tentando usar a variávelanotherSpy
. Mas não pode porque anotherSpy
não está nem dentro do escopo global nem no mesmo escopo local. Isso significa que este bloco de código não pode aceder-lhe. anotherSpy
está disponível apenas no bloco de código em que foi declarado.
o mesmo é verdadeiro na outra direção. Você pode ver que a última linha do nosso último bloco de código também tem um erro:
System.out.println(spy); // Error
Aqui, ele está tentando usar a variável spy de outro bloco de código. Mas não pode, uma vez que spy
não está no mesmo escopo do bloco de código que está tentando usá-lo.
âmbito variável nas classes
quando se declara uma classe, aplicam-se as mesmas regras gerais de escopo: cada variável só é acessível dentro do seu bloco de declaração. Vamos experimentar com um unicórnio classe:
assim como em nosso primeiro exemplo, há global de variáveis de classe, bem como os locais. Vamos rever em detalhe:
-
As variáveis
height
epower
são campos de classe e estão acessíveis em qualquer lugar dentro da classe. -
a variável
minutesToSleep
só é acessível no âmbito local do bloco de código em que é declarada. -
a variável só é acessível no âmbito local do bloco de código em que é declarada.
o âmbito de uma variável limita a sua acessibilidade por definição. No entanto, campos de classe são acessíveis fora da classe e podem ser usados por qualquer outro bloco de código.
no nosso exemplo, estes são height
epower
. Se declararmos uma variável Unicórnio, podemos ler ou alterar esses valores:
ser capaz de mexer com variáveis de classe pode ter consequências graves. A boa notícia é que podes controlar isso! Antes de verificar como, certifique-se de praticar com escopo variável.
experimente você mesmo!
controlo de acesso
vamos usar a ideia de controlo de acesso implementando acesso restrito a uma classe, módulo ou ficheiro. Você já sabe o que são uma classe e um arquivo desde que trabalhamos com eles!
um módulo é um pacote de arquivos fonte relacionados associados com um nome, como um framework. Um framework é um conjunto de funcionalidades agrupadas por um contexto particular. Acelera o processo de desenvolvimento e fornece orientações sobre como escrever o código.
Há uma série de frameworks fornecidos por cada ambiente de desenvolvimento. O fato é que a implementação desses frameworks está muito além do que os desenvolvedores que os usam podem ver e utilizar. Isso é feito restringindo o acesso aos detalhes da implementação, também conhecido como implementar o controle de acesso.
Controle de níveis
Em Java, você precisa usar uma das palavras-chave para designar um nível de controle:
-
Público: visível para o mundo e, portanto, menos restritivas
-
Protegido: visível para o pacote e todas as suas subclasses
-
Pacote protegida: normalmente visível apenas para o pacote de que eles estão em (configurações padrão)
-
Privada: só acessível no contexto em que eles são definidos dentro da classe em que está localizado)
Colocar essas distintas restrições torna o desenvolvimento mais fácil. Você não tem que se preocupar com qualquer visibilidade indesejada de sua implementação e, mais ainda, modificações indesejadas.
coloque uma palavra-chave adequada na frente da declaração relacionada:
então, se você tentar acessar membros privados de fora da classe, você recebe erros:
os níveis de controlo podem ser atribuídos a elementos de classe e classes:
public class PublicClass {}private class PrivateClass {}
além da segurança, a especificação dos níveis de controlo para os membros da classe proporciona uma melhor legibilidade. Quando um desenvolvedor está preparando um arquivo de código, é sempre claro quais elementos podem ser usados externamente.
hierarquia de controlo
um elemento pode ter o mesmo ou mais restritivo nível de controlo do que o elemento que o contém:
no exemplo acima, a classe é declarada como public
. Uma vez que a classe é o elemento que contém, isto significa que todos os elementos dessa classe podem ter o mesmo ou menor nível de exposição. Neste caso, inclui todos os níveis.
Se você declarar uma classe como o private
, seus elementos só pode ser package-private
ou private
:
class PrivateClass { int internalProperty = 0; // automatically assigned package-private by default protected defaultProperty = true; // automatically assigned package-private public boolean publicProperty = true; // automatically converted to package-private private String fileprivateProperty = "Hello!"; //only available to the class private static void privateMethod() { }}
No exemplo acima, adicionamos um atributo sem uma explícita de controle de acesso de palavras-chave. Neste cenário, por padrão, assume o nível do elemento contendo. Neste caso, é a nossa classe, por isso assume o nível de PrivateClass
.
uma classe de Topo não pode ser marcada privativa, mas se a definir como padrão irá colocá-la no nível protegido por pacotes. Ao declarar uma variável de uma classe, se o nível de controle do contexto da declaração for superior ao da classe, a variável também deve ter um nível de controle explícito. Vamos declarar uma variável FileprivateClass:
String a = PrivateClass(); // Errorprivate String b = PrivateClass(); // Okprivate String c = PrivateClass(); // Ok
como você pode ver, se o nível de acesso padrão do contexto da variável é maior do que uma classe que você está atribuindo a ela, você deve especificar explicitamente o nível da variável como o mesmo ou menor do que o da classe.
resumo
neste capítulo, você aprendeu sobre acessibilidade variável:
-
um âmbito de uma variável é a área de código onde foi declarada.
-
âmbito geral da variável aplica-se a todos os blocos de código, incluindo as classes.
-
outra forma necessária para controlar o acesso a variáveis e funções é usando níveis de controle: público, Protegido, protegido por pacotes, e privado.