Existe isto no JAVA

16 respostas
R

Pessoal sou programador web e no JavaScript utilizo o prototype para extender os Objetos ex

String.prototype.alerta = function(){ alert(this); }

“Olá”.alerta();

Neste exemplo adicionei o metodo “alerta” ao Objeto String, tem como fazer isto no Java?

16 Respostas

dipeloco

Não existe não … o unico modo de extender uma funcionalidade é dar “extends”(herança) na classe que deseja especificar.
NO caso o String nem isso é possivel pois ela é final

ViniGodoy

No C# isso é possível através de extension methods. Ficaria assim:

public static class StringExtensions {
   public void alert(this String valor) {
      //faz qualquer coisa
   }
}


String x = new String();
x.alerta(); //Chama o método alerta de StringExtensions
M

Deve ter um framework pra isso. :roll:

Abdon

Não existe metaprogramação em java. Se vc quizer uma linguagem que possua isto te recomendo Ruby ou Python, que possuem classes abertas parecido com o javascript.

Para se ter uma idéia nem é possivel fazer uma função anonima igual vc esta fazendo em javascript. Em java metodos nem são cidadões de primeira classe :frowning:

dipeloco

Pessoal fiquei com uma duvida … utilizando RHINO isso é possivel ?

dipeloco
Segue conclusão. Funciona sim !!!!
package br.com.sample;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class Teste {
	public static void main(String[] args) throws ScriptException {
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("JavaScript");
        engine.eval("var a = function (){return 'marcelo'};");
        System.out.println(engine.eval("a()"));
	}
}
ViniGodoy

O que vc fez é diferente do que o colega fez. Você criou uma variável que o tipo é uma função.

O que ele quer saber é sobre pegar uma classe já pronta, e adicionar uma função extra.

dipeloco
Neste caso funciona também
package br.com.sample;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class Teste {
	public static void main(String[] args) throws ScriptException {
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("JavaScript");
        engine.eval("String.prototype.teste = function (){return 'opa'};");
        System.out.println(engine.eval("'marcelo'.teste()"));
	}
}
Abdon

Agora eu entendi prq eu tenho que colocar o using System.Linq para funcionar o metodo Where e Select nas minhas listas. Eu começei a usar C# agora nesse mês em janeiro, em um projeto aqui no meu trampo, to apanhando pra caramba.

Cada dia fico mais impressionado com o que o C# tem e o Java não tem. Como por exemplo os delegates em conjunto com o lambda operator, query linq, var keyword, propriedades, anonymous types e etc…

Abdon

Mas vc ta adiconando na classe String do javascript e não do Java, so esta usando um egine de script do java 6 para fazer isso a partir de um codigo java.

O cara queria saber se é possivel adicionar na classe String do java.

ViniGodoy

Por mim tinham que incorporar algo como o LINQ no Java. Os extension methods são legaizinhos, mas não deixam de ser sintax suggars. Agora, rodar queries em collections é realmente um recurso fantástico.

Em C#, para selecionar o nome de todos os alunos presentes numa turma é assim:

IList<Aluno> alunos = daoAlunos.carregarTurma(3); IList<String> alunosPresentes = new List<String>(from aluno in alunos where aluno.isPresente() == true select aluno.nome);

Nada de for, e deixe que ele ache a melhor estratégia para resolver essa encrenca.

Abdon
IList<Aluno> alunos = daoAlunos.carregarTurma(3);
alunos.Where(x => x.isPresente()).ToList();

So que no meu caso eu não estou pegando apenas o Nome. Tb acho interessante essa forma usando Lambda Operators, fica bem parecido com ruby onde raramente é preciso interar uma lista.

alunos.select {|a| a.isPresente()}
R

Obrigado pelas respostas

O amigo ovelha tem razão é interressante poder utilizar o ScriptEngineManager mas não extende a partir do java…

Sobre o LINQ, é possível obter este recurso atraves do Hibernate e foi a microsoft que copiou a idéia dele.

O Hibernate existe bem antes do LINQ tanto que a versão para o .NET foi descontinuado…

Abraços…

Abdon

Não é bem assim não, com o linq vc pode fazer query em praticamente qualquer coisa desde que vc tenha um provider escrito para tal. Fora que as querys linq, se vc reparar no exemplo do Vinni ela não esta como uma string igual se faz com hql. Por essa razão a query é validada em tempo de compilação, coisa que o hibernate nem sonha em fazer.

Fora que com Linq se pode criar objetos on the fly para retorno da query, coisa que o hibernate nem sonha, o maximo que se da para fazer com hibernate que é parecido seria retornar um Array de Object.

Não acho que Linq e Hibernate sejam tecnologias a se comparar, elas tem objetivos diferentes apesar de serem parecidas. Não se faz mapeamento relacional objeto com o linq como se faz com o hibernate, para isso existem outras coisas em .net como por exemplo o Entity Framework.

R

Vc pode retornar um Array de qualquer classe, não necessariamente um Object

ViniGodoy

Concordo com o ovelha. Comparar hibernate com LINQ é comparar mamão com abacaxi. Os dois são frutas, mas a semelhança para por aí.

Criado 2 de fevereiro de 2010
Ultima resposta 2 de fev. de 2010
Respostas 16
Participantes 5