Pergunta

Lamdbaj permite a definição de encerramentos na linguagem Java, vários exemplos podem ser encontrados aqui

A minha pergunta é sobre os mecanismos subjacentes Java em uso, por exemplo, para definir o fechamento println, o seguinte código é usado:

Closure println = closure(); 
{ of(System.out).println(var(String.class)); }

Este fechamento pode ser posteriormente executados via:

println.apply("foobar");

Estou curioso para saber quais os mecanismos em Java que permitem a chamada para of(...).println(...) para se tornar associado com o próprio exemplo println.

Naturalmente, o código fonte lambdaj está disponível para ler, mas eu estava esperando por uma explicação nível ligeiramente superior, se alguém tiver um. Minhas habilidades de reflexão ir tão longe como um pouco de introspecção e execução de métodos dinamicamente.

Foi útil?

Solução

Bem, of é presumivelmente um método static que é importado estaticamente para que possa ser chamado sem o nome da classe de fechamento. Espero que var é o mesmo. Ambos os métodos devem retornar algum tipo que tem os métodos posteriormente chamados:

public class Printable {
  public void println(Var var);
}

public class Fac {
  public static Printable of(Object o) {
    return new Printable(o);
  }

  public static Var var(Class<?> clazz) {
    return new Var(clazz);
  }

} 

De repente:

Fac.of(System.out).println(Fac.var(String.class));

é válido Java. Usando importações estáticas, voilá:

import static Fac.*;

of(System.out).println(var(String.class));

As chavetas são obviamente válida Java como você pode adicioná-los em qualquer método para ajuda na definição de um sope lexical. Este estilo API-design é chamado fluente e é melhor apresentado por JMock testar biblioteca.

A propósito, se isto é suposto apresentar tampas para Java, é bastante ridículo - a sintaxe é ilegível terrível . O seu exemplo I / O, na verdade, me fez rir em voz alta. Tente Scala !

Editar - as duas chamadas println estão associados acredito porque a primeira seqüência de chamadas permitem a biblioteca para capturar as variáveis ??que você passados ??como parâmetros. Estas provavelmente são capturados em alguma estrutura ThreadLocal. Quando você, em seguida, chamar um (também presumivelmente estática) Método println, a biblioteca está usando esses dados capturados para realmente executar o comportamento em um momento posterior. Também testar relacionada, a estrutura de teste EasyMock usa um mecanismo semelhante (que usa proxies Java em segundo plano) para valores esperados de captura.

Outras dicas

Estou Mario Fusco e eu sou o principal desenvolvedor da biblioteca lambdaj.

Primeiro de tudo eu gostaria de esclarecer uma coisa: lambdaj não se destina a substituir qualquer linguagem funcional. Como eu disse na semana passada em meu discurso no Jarro de Zurique se você tem a chance de usar Scala, vá para ele e nunca olhar para trás. Aqui pode encontrar um resumo do meu discurso em que se afirma claramente que:

http://ctpjava.blogspot.com/

2009/10 / New-tendências-em-java.html lambdaj-

Eu sou um desenvolvedor Scala feliz também. Mas às vezes você está apenas obrigado a se desenvolver em Java (na minha experiência, no mundo real, sobre o 80% de vezes que você não pode escolher o idioma em que você tem que escrever o seu código) e, neste caso algumas das características lambdaj poderia ser útil (ou assim espero). Eu só queria trazer para Java algumas características funcionais que estão totalmente ausentes. Claro que o resultado não é satisfatório completamente principalmente devido à limitação imposta pelo próprio Java.

Quanto ao mecanismo de lambdaj interna, sim ele usa um ThreadLocal para alcançar esse resultado. Se você tiver outras perguntas, curiosidades ou até melhor sugestões e críticas construtivas sobre lambdaj talvez você poderia estar interessado em registar-se à lista de discussão lambdaj aqui:

http://groups.google.com/group/lambdaj

Bye Mario

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