Erro com inner classes

Oi pessoal, boa tarde.

Ao fazer isso aqui:

public class EmployeeImpl implements Employee {
	private Integer id;
	private String name;
	private Wage wage;

	public abstract class EmployeePersistenceStrategy implements
		PersistenceStrategy {
		public void test() {
			id = 1; // olha, eu tenho acesso!
		}
		
		public abstract List getAllByWage( Double wage );
		public abstract List getAllByExtra( Double extra );
		public abstract void deleteAllFired( Date initialDate, Date finalDate );
	}
}

public class EmployeePersistenceStrategyHibernate extends
		EmployeeImpl.EmployeePersistenceStrategy
		
{
	public EmployeePersistenceStrategyHibernate() {

	}

	// implementação dos métodos
}

Recebo este erro de compilação na declaração do construtor da EmployeePersistenceStrategyHibernate:

No enclosing instance of type EmployeeImpl is available due to some intermediate constructor invocation

Alguém imagina a razão?

Valeu povo :smiley:

Uhm…classe pública dentro de outra? :roll:

Sem problemas aqui :smiley: Java 5 creio @.@

Duh! Não tinha visto que era inner :stuck_out_tongue:

o problema ai esta no modo em como a maquina virtual do java resolve
suas classes…ela simplismente não pode acessar uma classe interna
sem que a mais externa esteja resolvida…
porem se a sua inner class fosse static dai daria certo…mas acho que
classes estaticas não podem ser abstratas…
[]´s dyorgio

Sim, podem ser estáticas.

Mas desta maneira eu perco o objetivo que é herdar os atributos e métodos de EmployeeImpl. Se é que funciona desse jeito hehe

Cara dá certo sim.
Vc pode ter uma classe estatica e abstrata e pode usa-la por herança.
Também cheguei a uma arquitetura identica a sua depois daquela discussão sobre atributos privados e mecanismos de persistencia.
Fiz um teste e funcionou.
Isso dá certoi sim…

Tenta isso


public class EmployeeImpl implements Employee {
 	private Integer id;
 	private String name;
 	private Wage wage;
 
 	public static abstract class EmployeePersistenceStrategy implements
 		PersistenceStrategy {
                                protected  int id;
 		public void test() {
 		}

                                // pegue o valor do objeto passado
                                public void save(Employee e) {
                                    this.id = e.id; // olha, eu tenho acesso!
                                 }

 		public abstract List getAllByWage( Double wage );
 		public abstract List getAllByExtra( Double extra );
 		public abstract void deleteAllFired( Date initialDate, Date finalDate );
 	}
 }
 
 public class EmployeePersistenceStrategyHibernate extends
 		EmployeeImpl.EmployeePersistenceStrategy
 		
 {
 	public EmployeePersistenceStrategyHibernate() {
 
 	}
 
 	// implementação dos métodos
               public void save(Employee e)
               { 
                     super.save(e);
                     id // tem valor e posso ver
               ]
 }
 

Achei a solução, e aprendi que não acontece o que gostaria.
É necessário declarar o seguinte construtor:

public EmployeePersistenceStrategyHibernate( EmployeeImpl impl )
{
	impl.super();
}

Razão aqui:
http://ellem.is-a-geek.org:5280/tij3/TIJ310.htm#Heading7757

Desse jeito vc faz fazer referencia a uma instancia vazia.
O que importa é ter acesso aos atributos de uma instancia já criada ou criar uma dentro da inner class.
E tem mais tente acessar o id da subclasse;

Não entendi jprogrammer.

Realmente essa explicação tá uma b…
Mas vc não entendeu o código ou a explicação.

Do jeito que vc colocou a subclasse não tem acesso a variavel privada da outerclass.
Vc tem que acessar os atributos da outerclass de dentro da innerclass agora isso não pode ser através da subclass da innerclass
:shock: (que mer…)

Sim, entendi que esse é o problema :smiley: por isso não adianta porcaria nenhuma isso tudo :smiley:

Também desisti desta meleca.
Ou faz a classe de dominio fazer a persistencia criando um subclasse que implementa as operações essas operações.

Enquanto isso vai ser o DAO e o Domain Model arreganhando tudo…

Credo :smiley:

E se eu quiser adicionar outro aspecto? hehe

Como assim?

Persistencia é um aspecto. Então estendo minha classe Pessoa em PessoaPersistivel.
E se houver outro aspecto? Visualização por exemplo, vou estender novamente? PessoaView extends PessoaPersistivel? :smiley:

ps.: não sei se aspecto é uma boa palavra aqui.

LIPE, o que acha de implementações de interfaces em vez de extensões de classes?

Se você me disser como isso resolve o problema, ótimo :smiley:

Referente a questão da persistencia com atributos protegidos pensei nisso:


package funcionario;

public abstract class Funcionario {
   private int id;
   private String nome;

   protected int getId() {
     return this.id;
   }

   protected void setId(int id) {
     this.id = nome;
   }

   public String getNome() {
     return this.nome;
   }

   public void setNome(String nome) {
     this.nome = nome;
   }

   public String getNome() {
     return this.nome;
   }
   
   public static Funcionario criarNovo() {
     return FuncionarioDAO.criarNovo();  
   }

   public final void cadastrar() {
      // valida
      FuncionarioDAO.salvar(this);
   }
}

package data;

class FuncionarioPersistente extends Funcionario
{
  protected int getId() {
   return super.getId();
  }

  protected void setId(int id) {
    super.setId(id);
  }
}


public class FuncionarioDAO
{
  public Funcionario criarNovo()
  {
     return new FuncionarioPersistente();
  } 

  public void salvar(Funcionario f)
  {
     FuncionarioPersistente fp = (FuncionarioPersistente ) f;
     fp.setId(gerId());
     // salvar
  } 
}


package teste;

Funcionario f = Funcionario.criarNovo();
f.setNome("Maria");
f.salvar();