Pergunta

Eu tenho duas classes, e deseja incluir uma instância estática de uma classe dentro dos outros e acessar os campos estáticos a partir da segunda classe, através da primeira.

Esta é para que eu possa ter instâncias não-idênticos com o mesmo nome.

Class A 
{
    public static package1.Foo foo;
}

Class B 
{
    public static package2.Foo foo;
}


//package1
Foo 
{
    public final static int bar = 1;
}

// package2
Foo
{
    public final static int bar = 2;
}

// usage
assertEquals(A.foo.bar, 1);
assertEquals(B.foo.bar, 2);

Isso funciona, mas eu recebo um aviso "O campo estático Foo.bar shoudl ser acessado de forma estática". Alguém pode explicar por que isso é e oferecer uma implementação "correta".

Eu percebo que eu poderia acessar as instâncias estáticos diretamente, mas se você tem uma hierarquia de pacotes de comprimento, que fica feio:

assertEquals(net.FooCorp.divisions.A.package.Foo.bar, 1);
assertEquals(net.FooCorp.divisions.B.package.Foo.bar, 2);
Foi útil?

Solução

Eu concordo com outros que você provavelmente está pensando sobre isso da maneira errada. Com isso fora do caminho, isso pode funcionar para você, se você só está acessando membros estáticos:

public class A {
    public static class Foo extends package1.Foo {}
}
public class B {
    public static class Foo extends package2.Foo {}
}

Outras dicas

Você deve usar:

Foo.bar

E não:

A.foo.bar

Isso é o que os meios de alerta.

A razão é que bar não é um membro de um exemplo de Foo. Em vez disso, bar é global, no Foo classe. O compilador quer que você para referenciá-lo globalmente em vez de fingir que é um membro da instância.

Não há nenhum sentido em colocar estas duas variáveis ??estáticas nestes às aulas, desde que você precisa somente aos membros acesso estáticos. O compilador espera que você acessá-los da calha prefixos de nome de classe como:

package1.Foo.bar
package2.Foo.bar

Uma vez que você criou o objeto em:

public static package1.Foo foo;

não está sendo acessado de forma estática. Você terá que usar o nome da classe e, claro, o nome completo do pacote para resolver a classe uma vez que têm o mesmo nome em diferentes pacotes

É verdade que uma instância de Foo tem acesso a campos estáticos do Foo, mas pensar sobre a palavra "estática". Significa "estaticamente ligado", pelo menos neste caso. Desde A.foo é do tipo Foo, "A.foo.bar" não vai pedir o objeto para o "bar", que vai ir direto para a classe. Isso significa que, mesmo se uma subclasse tem um campo estático chamado "bar", e foo é uma instância de que subclasse, ele vai ficar Foo.bar, não FooSubclass.bar. Portanto, é uma idéia melhor para fazer referência a ela pelo nome da classe, pois se você tentar tirar proveito da herança você vai atirar no próprio pé.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top