Ops! Foi mal :oops: …me desculpe, foi o Leonardo3001.
Não sei se é um pouco precoce perguntar isto agora, mas e o groovy como fica? Pois dentre outras coisas ele tb possui closures. Será que estas funcionalidades “dinâmicas” na jdk vão matar o groovy?
O Groovy fica no canto dele, sem nada a ver com a história. Nada muda.
Talvez melhorem o suporte e o conjunto de instruções da JVM, e com isso a performance de qualquer linguagem dinâmica na plataforma, mas só isso.
[milésima mensagem. ]
Bem, desde a primeira vez que vi closures em java achei a sintaxe feia, confusa e cheia de pegadinhas e regras estranhas por debaixo dos panos (algo inerente da condição de ser uma feature tardia que obrigatoriamente teve que ser implementada com gambiarras na linguagem para não violar o backwards-compatible, a la generics).
Mas realmente, eu vi uma tendência de que closures virou modinha e tem muita gente tentando rubynizar o java usando closures só porque acha bonito, sem haver necessidade.
Há também um grande perigo na manutenção. Gambiarrizadores que produzem toneladas de código de péssima qualidade têm dificuldades com generics porque usá-los em lugar inadequado quase sempre resulta em erro de compilação, warning ou ClassCastException. Mas com closures é diferente: é possível utilizá-lo para fazer um goto dinâmico e destruir a manutenibilidade do código.
Ou seja, é um recurso poderoso e muito útil, mas também perigoso. Não deve ser usado a torto e a direito, senão vai trazer mais problemas do que resolver.
Isso eu achei interessante:
[code]public class A {
public static void main(String args[]) {
@Shared int x = 0;
{int, int => int } xxx = { int a, int b => x += a + b ; x};
System.out.println(xxx.invoke(3,4));
System.out.println(xxx.invoke(2,4));
}
}[/code]
Sem o @Shared eu recebo um warning, nada mais do que justo!
:oops: ainda vou entender com mais carinho as closures, ainda não entendi um uso no meu dia a dia.
Vendo o Mauricio com essa foto malvada ai acho que vou ver o Scala que só ouvir falar rsss
eu não paro de estudar desde os meus 16 anos e to com 30 rsss, já foi tantas linguagens.
:roll:
hum… ja ate sei do que as proximas edições da javamagazine e mundojava iram falar…
po deveriam colocar ponteiros na linguagem… sinto falta dos ponteiros…
[quote=luistiagos]
po deveriam colocar ponteiros na linguagem… sinto falta dos ponteiros…[/quote]
Curiosidade: Que falta eles te fazem no dia a dia ?
[quote=Ssalgado][quote=luistiagos]
po deveriam colocar ponteiros na linguagem… sinto falta dos ponteiros…[/quote]
Curiosidade: Que falta eles te fazem no dia a dia ?[/quote]
Acho que ele estava sendo irônico.
É…também achei isso curioso.
[quote=victorwss][quote=Ssalgado][quote=luistiagos]
po deveriam colocar ponteiros na linguagem… sinto falta dos ponteiros…[/quote]
Curiosidade: Que falta eles te fazem no dia a dia ?[/quote]
Acho que ele estava sendo irônico. [/quote]
Se sim, foi mal. hehe
Se não, ainda estou curioso.
Alguém pra falar de ponteiros em Java só pode estar sendo irônico mesmo. rs
Uma coisa que seria interessante em closures é se eu pudesse fazer currying também.
Não cheguei a brincar suficientemente com o protótipo final (e olhe que eu estou acompanhando isso desde as primeiras propostas do Gafter), mas eu gostaria de fazer algo semelhante ao que posso fazer no Boost:
#include <boost/asio.hpp>
...
boost::asio::async_read (socket, boost::asio::buffer (buf, 0, nbytes),
boost::bind (&MyClass::MyReadHandler, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
onde “boost::bind” é um template que efetua o currying de MyReadHandler, passando a “this” o ponteiro para função-membro “MyClass::MyReadHandler”, e então passando os parâmetros a essa função-membro: error e bytes_transferred.
[quote=thingol] Uma coisa que seria interessante em closures é se eu pudesse fazer currying também.
Não cheguei a brincar suficientemente com o protótipo final (e olhe que eu estou acompanhando isso desde as primeiras propostas do Gafter), mas eu gostaria de fazer algo semelhante ao que posso fazer no Boost:
view plaincopy to clipboardprint?
- #include <boost/asio.hpp>
- …
- boost::asio::async_read (socket, boost::asio::buffer (buf, 0, nbytes),
-
boost::bind (&MyClass::MyReadHandler, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
#include <boost/asio.hpp> … boost::asio::async_read (socket, boost::asio::buffer (buf, 0, nbytes), boost::bind (&MyClass::MyReadHandler, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
onde “boost::bind” é um template que efetua o currying de MyReadHandler, passando a “this” o ponteiro para função-membro “MyClass::MyReadHandler”, e então passando os parâmetros a essa função-membro: error e bytes_transferred. [/quote]
??? :shock: ???
[quote=fantomas][quote=thingol] Uma coisa que seria interessante em closures é se eu pudesse fazer currying também.
Não cheguei a brincar suficientemente com o protótipo final (e olhe que eu estou acompanhando isso desde as primeiras propostas do Gafter), mas eu gostaria de fazer algo semelhante ao que posso fazer no Boost:
view plaincopy to clipboardprint?
- #include <boost/asio.hpp>
- …
- boost::asio::async_read (socket, boost::asio::buffer (buf, 0, nbytes),
-
boost::bind (&MyClass::MyReadHandler, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
#include <boost/asio.hpp> … boost::asio::async_read (socket, boost::asio::buffer (buf, 0, nbytes), boost::bind (&MyClass::MyReadHandler, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
onde “boost::bind” é um template que efetua o currying de MyReadHandler, passando a “this” o ponteiro para função-membro “MyClass::MyReadHandler”, e então passando os parâmetros a essa função-membro: error e bytes_transferred. [/quote]
??? :shock: ???[/quote]
Tambem não entendi bulhufas. Mas sei que é porque ainda não estamos no nivel Yoda, somos padawans ainda. Quero virar Jedi até o fim do ano, mas Yoda… rs… Tá dificil!
No aguardo de um post elucidativo e didático.
[quote=Sergio Figueras][quote=fantomas][quote=thingol] Uma coisa que seria interessante em closures é se eu pudesse fazer currying também.
Não cheguei a brincar suficientemente com o protótipo final (e olhe que eu estou acompanhando isso desde as primeiras propostas do Gafter), mas eu gostaria de fazer algo semelhante ao que posso fazer no Boost:
view plaincopy to clipboardprint?
- #include <boost/asio.hpp>
- …
- boost::asio::async_read (socket, boost::asio::buffer (buf, 0, nbytes),
-
boost::bind (&MyClass::MyReadHandler, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
#include <boost/asio.hpp> … boost::asio::async_read (socket, boost::asio::buffer (buf, 0, nbytes), boost::bind (&MyClass::MyReadHandler, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
onde “boost::bind” é um template que efetua o currying de MyReadHandler, passando a “this” o ponteiro para função-membro “MyClass::MyReadHandler”, e então passando os parâmetros a essa função-membro: error e bytes_transferred. [/quote]
??? :shock: ???[/quote]
Tambem não entendi bulhufas. Mas sei que é porque ainda não estamos no nivel Yoda, somos padawans ainda. Quero virar Jedi até o fim do ano, mas Yoda… rs… Tá dificil! [/quote]
Me senti um merda agora…
[quote=peczenyj]Isso eu achei interessante:
[code]public class A {
public static void main(String args[]) {
@Shared int x = 0;
{int, int => int } xxx = { int a, int b => x += a + b ; x};
System.out.println(xxx.invoke(3,4));
System.out.println(xxx.invoke(2,4));
}
}[/code]
Sem o @Shared eu recebo um warning, nada mais do que justo![/quote]
Deveria ser o contrário, com o @Shared: Warning: too many gambiarras
[quote=renato3110][quote=peczenyj]Isso eu achei interessante:
[code]public class A {
public static void main(String args[]) {
@Shared int x = 0;
{int, int => int } xxx = { int a, int b => x += a + b ; x};
System.out.println(xxx.invoke(3,4));
System.out.println(xxx.invoke(2,4));
}
}[/code]
Sem o @Shared eu recebo um warning, nada mais do que justo![/quote]
Deveria ser o contrário, com o @Shared: Warning: too much gambiarras[/quote]
O Shared é uma gambiarra para permitir que o closure altere o valor da variável local.
CHUTE: ACHO que isso pode ser implementado pelo compilador criando um objeto oculto no método, transformando a variável local em um atributo deste objeto oculto e fazendo tanto o método quanto o closure usar este atributo. Quando o método termina, o objeto contendo o atributo ainda existe no heap, até que o coletor de lixo o descarte.
Quando a variável é final, sem problemas. O compilador faz o mesmo que ele faz atualmente com classes anônimas. Mas quando não é, essa manobra do compilador resolve o problema.
Aliás, isso não serve apenas para closures. Pode ser usado para classes anônimas também, resolvendo o problema do “annoying final”.
Daí, aquele erro de compilação de que a variável local deveria ser final se reduziria a uma warning (porque provavelmente o compilador fará algo que faz com que a variável local deixe de ser de fato apenas uma variável local). Daí o @Shared funciona mais ou menos como um @SuppressWarnings para isso.
Edit: BTW closures são reduzidos pelo compilador em classes anônimas que posteriormente são reduzidas a classes internas e por fim a classes normais com visibilidade de pacote.
[quote=thingol]Uma coisa que seria interessante em closures é se eu pudesse fazer currying também.
Não cheguei a brincar suficientemente com o protótipo final (e olhe que eu estou acompanhando isso desde as primeiras propostas do Gafter), mas eu gostaria de fazer algo semelhante ao que posso fazer no Boost:
#include <boost/asio.hpp>
...
boost::asio::async_read (socket, boost::asio::buffer (buf, 0, nbytes),
boost::bind (&MyClass::MyReadHandler, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
onde “boost::bind” é um template que efetua o currying de MyReadHandler, passando a “this” o ponteiro para função-membro “MyClass::MyReadHandler”, e então passando os parâmetros a essa função-membro: error e bytes_transferred.
[/quote]
Isso é currying de função ou pré-configuração do objeto?
Currying em Java só no dia que tivermos objetos-Função/Bloco