Por que o Java não possui Accessors (GET SET) como o C#?

34 respostas
D

em C# temos os Accessors para construção get set, poque o java não possui o mesmo, exemplo:

C#:

class Pessoa
{
    public string nome {
        get; //get comum
        set { //set que valida o parametro
            if (value != null)
                nome = value;
        } 
    }
}

Java (também disponível no C#):

class Pessoa
{
    public String nome;

    public String getNome() {return nome;} //get comum
    public void setNome(String value)
    { //set que valida o parametro
        if (value != null)
            nome = value;
    }
}

34 Respostas

D

porque não implementaram isso simplesmente, umas das coisas q acho ridiculo =(

N

O uso das propriedades para o .NET nos poupa bastante trabalho, não? É só escrever prop, dar tab duas vezes, e tanto a variável quanto os get e set desta estão implementados. O Java não criou um recurso parecido ainda, por isso não há o uso de propriedades da mesma maneira do .NET, simplesmente por isso.

J

Vai saber…

No PHP tem os gets e sets, que eles chamam de mágicos, mas prefiro o termo genéricos. Pois quando você não define um get e set específico e na sua classe tem esses dois métodos, então eles passam a interceptar qualquer requisição para os atributos da classe.

Exemplo:

class Carro{

private $cor;
private $marca;

public __get( $atributo ){
   return $this->atributo;
}

public __set($atributo, $valor ){
  $this->atributo = $valor;
}

}

//Depois para usar

$carro = new Carro();

$carro->cor = "vermelho";

echo $carro->cor;

Bem louco né…

D

Por que o português precisa ter tantas flexões verbais, que variam de acordo com a pessoa e o tempo?
Por que, no inglês, os verbos regulares têm uma forma diferente de serem conjugados do que os irregulares?
Por que o alemão permite unir várias palavras em uma única?

Cada linguagem segue determinadas premissas, padrões e definições, assim como cada projeto que vamos desenvolver durante a vida. É algo bom, ótimo. Mas nem todas as linguagens precisam implementar.
Indo nessa lógica, por que C# e Java não possuem suporte à herança múltipla, como C++ possui?

E

http://bugs.sun.com/view_bug.do?bug_id=4228585

J

drsmachado:
Por que o português precisa ter tantas flexões verbais, que variam de acordo com a pessoa e o tempo?
Por que, no inglês, os verbos regulares têm uma forma diferente de serem conjugados do que os irregulares?
Por que o alemão permite unir várias palavras em uma única?

Cada linguagem segue determinadas premissas, padrões e definições, assim como cada projeto que vamos desenvolver durante a vida. É algo bom, ótimo. Mas nem todas as linguagens precisam implementar.
Indo nessa lógica, por que C# e Java não possuem suporte à herança múltipla, como C++ possui?

Tá blz, padrões, premissas e definições são importantes, porém é necessário evoluir e simplificar, diferentemente da linguagem natural a linguagem de programação pode ser deixada de lado mais facilmente…

G

O que eu noto é que muita gente não sabe para que servem REALMENTE os métodos de acesso (get/set).

D

sim devia ser prioridade para o java isso, chega ser ridiculo não ter

E

O bug está aberto desde 1999.
Acredito que ele esteja na mesma categoria de “operadores definidos pelo usuário” e “herança múltipla”, ou seja, é algo que o pessoal da Oracle não vai implementar mesmo :slight_smile:

D

é o gilad.bracha respondeu o bug e não concordava com isso em 1999-04-15 ele alegava que para isso teria que considerar todos os campos privados pro default e isso é uma coisa que ele não poderia fazer.

In practice, I don’t expect such sugar to be added to Java. It adds no real
power, and without corresponding restrictions to enforce its use (i.e.,
make all fields private, which we cannot do) it is fairly inconsequential

não concordo ja que varias linguagens fazem isso.

mais é por que naquela epoca não existia o numero de frameworks que exite hoje dependendo do padrao java beans

A

Isso aí é fichinha. Ridículo é ver uma porrada de classe no JDK usando vector, o fracasso da API de datas, a gambiarra na implementação de generics, …

D

é ver uma porrada de classe no JDK usando vector
funciona acho q ta tramquilo

o fracasso da API de datas
isso realmente mais ja vai sair no java 8

a gambiarra na implementação de generics
é totalmente aceitavel para manter a compatibilidade não tem o que fazer e para grande massa não muda em nada no funcional.

os get e set e api de datas muda drasticamente o funcional de quase 100% dos usuarios java.

A

Se você soubesse ao menos o quão problemático é usar Vector você não diria isso.

Pois é, mas ainda não saiu (e isso que era previso pro Java 7). E enquanto isso temos que lidar com uma API tão bem escrita quanto os funks de hoje.

Isso porque você é um utilizador de ferramentas, quando você for criar uma ferramenta você vai ver o quão complicado é a solução adotada. Eles poderiam ter corrigido isso no Java 7 pelo menos, já que o suporte à versão 5 acabou. Isso iria facilitar muito a vida de quem desenvolve ferramentas.

Com certeza, mas isso significa que deva ser mais prioritário? O invoke dyamic na JVM não afetou quase ninguém diretamente, mas trouxe inúmeras vantagens (principalmente para a galera que mantém as linguagens alternativas na JVM).

D

JackOld:
drsmachado:
Por que o português precisa ter tantas flexões verbais, que variam de acordo com a pessoa e o tempo?
Por que, no inglês, os verbos regulares têm uma forma diferente de serem conjugados do que os irregulares?
Por que o alemão permite unir várias palavras em uma única?

Cada linguagem segue determinadas premissas, padrões e definições, assim como cada projeto que vamos desenvolver durante a vida. É algo bom, ótimo. Mas nem todas as linguagens precisam implementar.
Indo nessa lógica, por que C# e Java não possuem suporte à herança múltipla, como C++ possui?

Tá blz, padrões, premissas e definições são importantes, porém é necessário evoluir e simplificar, diferentemente da linguagem natural a linguagem de programação pode ser deixada de lado mais facilmente…


Sinceramente, acho essa discussão algo sem fundamento.
Penso da seguinte forma, se você é um serralheiro e não gosta da forma como a serra funciona é por que, provavelmente, você não sabe utilizar a serra.
Se você acha que com um machado conseguiria fazer melhor, so, go ahead dude!.
Trocando em miúdos, não gosta da forma como o java é e acha o .NET melhor, vai programar com .NET e para de reclamar.
E para finalizar, para quem reclama demais saca só

E

A propósito, se você criar “accessors” da forma padrão (getters / setters), a JVM consegue, em grande parte dos casos, converter isso para um acesso direto a campo, evitando a chamada ao método getter/setter. Existe uma chave na JVM (+XX:+UseFastAccessors) que está ligada por default, ou seja, sempre que possível, a JVM faz essa otimização.

Se o getter/setter tiver mais código que uma atribuição simples (no caso do setter) ou um retorno simples (no caso do getter) ele não pode ser otimizado dessa forma.

A

Concordo plenamente!

N

Concordo plenamente!
Concordo plenamente! [2]

Eu programo em .NET hoje porque meus desenvolvimentos são quase em sua totalidade voltados para WEB, a plataforma me atende melhor em diversas situações que a do JAVA. Isso não desmerece o JAVA e seus recursos, de modo algum. Só não entendo o porquê de discussões tão ferrenhas sobre a preferência alheia. Seria muito mais prático usar essas discussões para procurar pontos fortes em cada uma delas, e assim melhorar o seu conhecimento sobre cada tecnologia em questão.

D

Quando, no fim dos anos 1980 (me sinto velho quando vejo/escrevo algo assim), o pessoal da Sun começou o que viria a se tornar a plataforma/linguagem java, eles consideraram desenvolver em C.
Acontece que, do C, o java só teve a primeira JVM e a sintaxe, pois o resto foi reescrito.
Reescrito por que? Oras, simplesmente por que os caras viram que gerenciamento automático de memória deixava a atividade de desenvolvimento menos suscetível a erros de programação por desatenção. Aliás, reescrito não, foi criado.
O PHP surgiu por que o autor achava complicado demais programar nas linguagens que existiam à época e, bem, se tornou a linguagem de programação que é hoje. O Ruby nasceu por que o criador desta linguagem achava que seria muito mais interessante escrever códigos sem que estes parecessem codificados demais, quase como linguagem natural. E, bem, ele nasceu.
Indo além, o Pascal nasceu para ser uma linguagem mais fácil de ser aprendida. O C nasceu por que a linguagem, B, anterior era totalmente antididática e complexa (imagine quão complexa era a linguagem B!).
O C# nasceu em sintonia com a plataforma .NET para que fosse possível tentar superar coisas como o VB6 e o ASP clássico. Ele é um parente do java, digamos um irmão, que pode ser lapidado, afinal, foi construído usando o que já havia de bom no Java, somado à várias melhorias.

Portanto, penso que discutir por que a galinha atravessou a rua é, pura e simplesmente, falta do que fazer.

J

Java não possui essa funcionalidade porque o Gosling desenvolveu essa linguagem para ser simples e de fácil assimilação para quem programa em c. Aliás existem muitas outras que ele deixou de fora com o mesmo intuito, como sobrecarga de operadores, bytes não sinalizados, etc…
Apesar de eu achar properties(properties veio do object pascal e foi adicionada pelo Anders ao c#) uma coisa muito boa, a premissa da linguagem java é por deixar as coisas o mais simples na medida do possível.

D

Diabo Loiro wrote:
é ver uma porrada de classe no JDK usando vector
funciona acho q ta tramquilo

Se você soubesse ao menos o quão problemático é usar Vector você não diria isso.

1- os designer da linguagem sabem das limitações de vector se fosse impeditivo seria um bug.

2 - nos outros pontos concordo mais, quem lida com linguagens dinamicas por exemplo é minoria, então a prioridade devia ser atingir a massa, por exemplo acertando api de datas ou properties.

A

Diabo Loiro:
Diabo Loiro wrote:
é ver uma porrada de classe no JDK usando vector
funciona acho q ta tramquilo

Se você soubesse ao menos o quão problemático é usar Vector você não diria isso.

1- os designer da linguagem sabem das limitações de vector se fosse impeditivo seria um bug.

2 - nos outros pontos concordo mais, quem lida com linguagens dinamicas por exemplo é minoria, então a prioridade devia ser atingir a massa, por exemplo acertando api de datas ou properties.

Eles também sabem das limitações da API de datas…

Bom, como já disseram, é uma tremenda perda de tempo discutir isso… se acha que deveria ser igual ao C#, sugiro mudar para o C#. Se quer atingir a “massa”, vire sindicalista.

D

Ou padeiro… Pizzaiolo…

D

é q foi perdido o foco do topico o cara perguntou pq java nao possui os properties e a resposta seria pq não quiseram simplismente e seria bom colocar, o que é diferente dos generics que não é possivel senão quebra compatibilidade.

D

Na verdade, tópicos como este estão sempre fadados à isto.
Toda e qualquer observação que faça a comparação entre A e B vai gerar esse desvio. Isso é natural, afinal, os argumentos que serão colocados para explicar a filosofia da linguagem é o que acaba por despertar a necessidade de ser mais voraz.
Mac x Windows, Windows x Linux, Linux x Mac, iOS x Android, Android x Windows Phone, Windows Phone x iOS, Web x Desktop, Maragatos x Chimandos, Caprichoso x Garantido, Palmeiras x Corinthians, Brasil x Argentina, Religiosos x Ateus, Católicos x Evangélicos, Católicos x Muçulmanos, Xiitas x Sunitas, Heteros x Homos…
Este tipo de assunto é algo que não leva a lugar algum, como os citados acima.
Sempre considero o seguinte:

  • Me sinto bem trabalhando com isto?
  • Ganho o suficiente por trabalhar com isto?
  • É algo que eu gosto de fazer?
    Se a resposta for não para alguma das perguntas, já descarto. Se todas forem sim, significa que estou no rumo certo.
    Portanto, com acccessors ou sem, você é quem escolhe, o mercado é que seleciona.
A

Quebrar a compatibilidade não significa que não é possível. A keywork assert, inclusa no Java 1.4 e o tipo enum, no Java 5, estão aí pra provar. E implementar as properties não é tão simples assim quanto parece pois não será somente um “syntax suggar”.

J

Sinceramente… Ter accessors, properties ou qualquer outra coisa eh tao util quanto o uso indiscriminado de gets e sets gerados por um generate gets e sets do eclipse por exemplo. Um sistema oo bem modelado poucas vezes tem atributos tao burros assim em uma classe.
e se a falta disso esta impactando na produtividade, na boa nao consigo nem imaginar o sistema de borracharia que esta sendo feito…
falei…

D

não é isso é que os frameworks dependem de java beans e no final temos que gerar mtos codigos repetitivos, se usarmos os frameworks, properties diminuiriam o esforço e deixariam o codigo mais limpo

J

o codigo mais limo ate pode ser mas continuo achando irrelevante.
na questao esforco discordo…

J

drsmachado:
JackOld:
drsmachado:
Por que o português precisa ter tantas flexões verbais, que variam de acordo com a pessoa e o tempo?
Por que, no inglês, os verbos regulares têm uma forma diferente de serem conjugados do que os irregulares?
Por que o alemão permite unir várias palavras em uma única?

Cada linguagem segue determinadas premissas, padrões e definições, assim como cada projeto que vamos desenvolver durante a vida. É algo bom, ótimo. Mas nem todas as linguagens precisam implementar.
Indo nessa lógica, por que C# e Java não possuem suporte à herança múltipla, como C++ possui?

Tá blz, padrões, premissas e definições são importantes, porém é necessário evoluir e simplificar, diferentemente da linguagem natural a linguagem de programação pode ser deixada de lado mais facilmente…


Sinceramente, acho essa discussão algo sem fundamento.
Penso da seguinte forma, se você é um serralheiro e não gosta da forma como a serra funciona é por que, provavelmente, você não sabe utilizar a serra.
Se você acha que com um machado conseguiria fazer melhor, so, go ahead dude!.
Trocando em miúdos, não gosta da forma como o java é e acha o .NET melhor, vai programar com .NET e para de reclamar.

A discussão do pessoal tem fundamento sim. Quem já trabalhou com as duas linguagens sabe que não é puramente questão de gosto, basta reconhecer. Obviamente linguagem não é tudo e outros pesos estão envolvidos onde dependendo do cenário e pessoas se decide por uma plataforma ou outra.

L

O Java é muito lento para evoluir. Estão enrolando tanto com essa feature do lambda que todas as outras linguagens já tem! Até C++ tem lambda. Até Objective C tem lambda, haha! O muito inteiro tem lambda, menos o Java.

O Java é um atraso de vida. Se decidissem colocar propriedades na linguagem provavelmente levariam uns 10 anos para implementá-las.

D

javaflex:

A discussão do pessoal tem fundamento sim. Quem já trabalhou com as duas linguagens sabe que não é puramente questão de gosto, basta reconhecer. Obviamente linguagem não é tudo e outros pesos estão envolvidos onde dependendo do cenário e pessoas se decide por uma plataforma ou outra.

Discordo.
Você não é obrigado a aceitar trabalhar com algo que não gosta, tem sempre o direito de pedir demissão.
Vejo isto como gostar de cebola, quem gosta, come e quem não gosta, não come. Não precisa fazer drama, é simples assim.

J

drsmachado:
javaflex:

A discussão do pessoal tem fundamento sim. Quem já trabalhou com as duas linguagens sabe que não é puramente questão de gosto, basta reconhecer. Obviamente linguagem não é tudo e outros pesos estão envolvidos onde dependendo do cenário e pessoas se decide por uma plataforma ou outra.

Discordo.
Você não é obrigado a aceitar trabalhar com algo que não gosta, tem sempre o direito de pedir demissão.
Vejo isto como gostar de cebola, quem gosta, come e quem não gosta, não come. Não precisa fazer drama, é simples assim.

Claro, concordo que nunca ninguem deve se submeter a trabalhar no que não gosta, mas a discussão não é sobre gosto, são sobre melhorias. Então o importante é manter imparcialidade e ver como pode ser interessante que a linguagem X também tenha um recurso existente nas linguagens W, Y e Z. Do mesmo jeito que existem superioridades na plataforma Java em relação a plataforma .NET. Quando chegar lambda na linguagem Java você poderá sentir na prática uma das vantagens.

J

A questão de produtividade pode impactar se a ferramenta usada para trabalhar o código é mais simples. Por exemplo alguém usar o kate ou vim para editar um source diretamente num artefato exploded do jboss. Aliás eu uso muito esse tipo de editor.

J

[quote=drsmachado][quote=JackOld]

drsmachado:

Trocando em miúdos, não gosta da forma como o java é e acha o .NET melhor, vai programar com .NET e para de reclamar.

Discordo. Ninguém disse que não gosta da forma do Java, só que acha que algumas funcionalidades podem evoluir.

Criado 8 de maio de 2013
Ultima resposta 10 de mai. de 2013
Respostas 34
Participantes 12