Olá
Estou com dúvida na questão 55 do mock final do Head First Servlets & JSP
Enunciado:
Dado:
[code]public class ServletX extends HttpServlet{
public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException{
req.getSession().setAttribute(“key”,new X());
req.getSession().setAttribute(“key”,new X());
req.getSession().setAttribute(“key”,“x”);
req.getSession().removeAttribute(“key”);
}
}[/code]
e a classe listener:
[code]public class X implements HttpSessionBindingListener{
public void valueBound(HttpSessionBindingEvent event){
System.out.print(“B”);
}
public void valueUnbound(HttpSessionBindingEvent event){
System.out.print(“UB”);
}
}[/code]
Qual o resultado quando o método doGet for chamado?
A resposta no livro está BBUBUB, mas não entendi por quê, no livro não explicou direito. Eu achei que deveria ser BBBUB, mas nem tem alternativa com essa resposta.
Bom, primeiro vendo o JavaDoc
void valueBound ( HttpSessionBindingEvent event )
Notifies the object that it is being bound to a session and identifies the session
void valueUnbound ( HttpSessionBindingEvent event )
Notifies the object that it is being unbound from a session and identifies the session
Depois, vamos ver o que ocorre.
a - Criamos uma instância de X (vamos chamar de x1)
b - Chamamos getSession().setAttribute() com o valor de x1
-> Isso irá fazer com que seja invocado x1.valueBound ("B")
c - Criamos uma nova instância de X (vamos chamar de x2)
d - Chamamos getSession().setAttribute() com o valor de x2
-> Agora eu não sei se a seqüência correta é:
Primeiro se chama x1.valueUnbound, e depois x2.valueBound, ou
primeiro se chama x2.valueBound, e depois x1.valueUnbound. De qualquer maneira, veja qual das opções é possível com as duas seqüências. É interessante ler a documentação e o fonte de uma implementação qualquer. ("B-UB-B" ou "B-B-UB")
e - Chamamos getSession().setAttribute() com o objeto String "x"
-> Isso deve chamar x2.valueUnbound. Como a classe String não implementa HttpSessionBindingListener, então não se chama "x".valueBound. ("B-UB-B-UB" ou "B-B-UB-UB")
Então a resposta do livro é válida.