Estou tentando criar um jogo Tetris e estou recebendo o erro do compilador
Shape is not an enclosing class
quando tento criar um objeto
public class Test {
public static void main(String[] args) {
Shape s = new Shapes.ZShape();
}
}
Estou usando classes internas para cada forma. Aqui está parte do meu código
public class Shapes {
class AShape {
}
class ZShape {
}
}
O que estou fazendo errado ?
java
inner-classes
V Sebi
fonte
fonte
new Shape().new ZShape();
. A classeZShape
precisa de uma instância envolvente para ser instanciada.AShape
eZShape
estender a classe baseShapes
. Aninhar classes não é um design muito bom para esse problema.Respostas:
ZShape
não é estático, portanto, requer uma instância da classe externa.A solução mais simples é criar o ZShape e qualquer classe aninhada,
static
se possível.Eu também faria quaisquer campos
final
oustatic final
que você possa também.fonte
ZShape
static
totalmente derrota o propósito do que ele está tentando fazer, que é instanciar uma cópiaZShape
.static
torna isso mais fácil, não mais difícil.ZShape myShape = new Shape().instantiateZShape();
. Isso implica que o ZShape que você obtém não existe sem um Shape, que é a intenção aqui.Suponha que RetailerProfileModel seja sua classe Principal e RetailerPaymentModel seja uma classe interna. Você pode criar um objeto da classe Inner fora da classe da seguinte maneira:
fonte
underTest = Mockito.mock(Outer.class).new InnerNonStaticClass();
O que eu sugeriria não é converter a classe não estática em uma classe estática porque, nesse caso, sua classe interna não pode acessar os membros não estáticos da classe externa.
Exemplo:
Portanto, nesse caso, você pode fazer algo como:
fonte
Outer.Inner obj = new Outer().new Inner();
()
é obrigatório. No entanto, C, C ++ não é obrigatório. Aqui está um exemplo que não funciona. Além disso, eu encontrei este post . que explica mais sobre gramática em Java e como elas são analisadas. Eu adoraria ver um exemplo de caso quando essa sintaxe estiver funcionando para você.Conforme declarado nos documentos :
fonte
Às vezes, precisamos criar uma nova instância de uma classe interna que não possa ser estática, pois depende de algumas variáveis globais da classe pai. Nessa situação, se você tentar criar a instância de uma classe interna que não é estática,
not an enclosing class
será gerado um erro.Tomando o exemplo da pergunta, e se
ZShape
não puder ser estático, porque precisa de variável global deShape
classe?Como você pode criar uma nova instância de
ZShape
? É assim:Adicione um getter na classe pai:
Acesse-o assim:
fonte
fonte
Eu encontrei o mesmo problema. Eu resolvi criando uma instância para cada classe pública interna. quanto à sua situação, sugiro que você use outra herança além das classes internas.
então você pode novo Shape (); e visite o ZShape através de shape.zShape;
fonte
Não há necessidade de tornar a classe aninhada como estática, mas deve ser pública
fonte
Uma coisa que eu não percebi a princípio ao ler a resposta aceita foi que tornar estática uma classe interna é basicamente a mesma coisa que movê-la para sua própria classe separada.
Assim, ao obter o erro
Você pode resolvê-lo de uma das seguintes maneiras:
static
palavra-chave à classe interna oufonte
Caso a classe Parent seja única, use a seguinte maneira:
onde
getInstance()
retornará o objeto singleton da classe pai.fonte
Para atingir o requisito da pergunta, podemos colocar classes na interface:
e use como autor tentado antes:
Se estamos procurando a solução "lógica" adequada, deve ser usado o
fabric
padrão de designfonte