Membros privados não tão privados assim
25/11/2010 00:00
0
class Foo {
private String name
private void setName(String name) {
this.name = name.toUpperCase()
}
private String getName() {
return "name não era privado? -> ${this.name}"
}
}

Foo f = new Foo();
f.name = "bar"
println f.name


Tem algumas issues abertas no Jira sobre essa questão. Jutando com a questão da sobrescrição de membros privados será que não temos uma linguagem sensível demais quanto a visibilidade dos seus membros?
Tags: Groovy


0
Fabiano, vou dar meu pitaco aqui.

NO caso, o compilador do Groovy está vendo o seu código como um script.
Então, o que ele faz: ele cria uma classe que encapsula todo o texto que você criou como atributos de uma classe que, se não me engano o nome, é Script mesmo.

Como a classe está declarada dentro deste script, ela fica sendo uma classe privada interna do seu script.
Consequentemente, o seu script (que vai parar dentro de um método main nesta classe criada) possui acesso ao que é privado da classe privada, pois ela é interna ao script. Entendeu?


0
Na verdade mesmo que você utilize uma classe Java e não esteja num script o mesmo ocorre. Por exemplo:

Classe Foo.java
package ex.java;

public class Foo {
private String name = "bar";
}

Classe FooClient.groovy
package ex.groovy;

import ex.java.Foo;

public class FooClient {
Foo foo = new Foo();

static void main(String[] args) {
FooClient fu = new FooClient();
println fu.foo.name;

fu.foo.name = "barbar";
println fu.foo.name;
}
}

Se você compilar ambas as classes vai ver que mesmo assim FooClient consegue acessar os membros privados de Foo, usando a linha de comando:
java -cp ".;%groovy_home%\lib\*" ex.groovy.FooClient

Sendo assim temos acesso a qualquer coisa interna de uma classe Java, mesmo da biblioteca padrão. E isso é muito louco!
29/11/2010 00:00


0
Uai, sinistro hein?

Se fosse como um script, faria sentido, agora, desta outra forma, nem tanto.
Fica muito parecido com javascript.


0
Pelo que pude entender o Groovy SEMPRE usa reflexao quando acessamos uma propriedade e acaba acessando o membro privado.
29/11/2010 00:00


0
E ai pessoal, estou ressucitando este post pois notei que o problema ainda existe e gostaria de saber, como vocês fazem para contorná-lo?
Uma possibilidade seria uma propriedade read only e deixaria o acesso ao setter somente no construtor, trabalhando assim com objetos imutáveis.

[]s
17/06/2012 13:34



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto