Eu queria saber por que não posso fazer isso em Java:
publicstaticclassMyFunctor{// zilhões de static methods and fields, que não precisam da cláusula static// exemplo: main é ponto de entrada da aplicação, é staticpublicvoidmain(Stringargs[]){print("Obrigado Java por facilitar as coisas.")}}
Não seria bastante útil?
Outra dúvida, por que o main existe? Isto é, ouvi dizer que o static main não é muito OO, então por que em vez disso não foi definido o construtor da classe:
// A JVM cria uma instância da aplicaçãopublicclassFilme{publicFilme(){// no lugar do main}}
Porque o construtor da classe não foi feito para inicializar uma aplicação.
[]'s
Luca
Olá
renato3110:
Eu queria saber por que não posso fazer isso em Java:
. . . . . . . .
Não seria bastante útil?
Não entendi qual seria a vantagem além de um puta incentivo a programação estruturada.
Foi a maneira encontrada para localizar a classe que inicia o sistema. Nela são colocados alguns bytecodes a mais. Faça um pequeno teste usando javap. Será que você preferiria um arquivo em xml que ainda não existia qdo o Java foi criado, com a informação por onde iniciar?
[]s
Luca
cv1
Java tem o public static void main(String[]) pq as aplicacoes precisavam comecar de algum lugar, e construtores nao sao uma boa ideia pra isso - ou qualquer classe que tivesse construtor vazio (sem parametros) poderia ser “rodada”, o que nao eh exatamente uma boa ideia.
Concordo, nao eh muito OO. Java nao eh “muito OO”, pq ela foi bolada pra ser palatavel tanto pros malas que vieram do Smalltalk quanto compreensivel pros perdidos que estavam programando em C, e pros coitados programando em C++. Entao, voce vai encontrar muitas coisas assim, pra todo lado, na sintaxe.
renatosilva
Putz mas é isso que eu quero saber: por que não?
Luca:
Olá
Não entendi qual seria a vantagem além de um puta incentivo a programação estruturada.
Mas eu eu tiver uma classe que não tem sentido instanciar, vou digitar static nos membros de qualquer forma, então isso podia ser facilitado.
Na minha opinião os caras não fizeram isso simplesmente por não fazer.
Quando eu rodo um jar, que tal o main-class? O que é javap?
Lembrando que eu prefiro o main, mas tenho essas dúvidas.
caiofilipini
Putz mas é isso que eu quero saber: por que não?
Construtores foram feitos para inicializar objetos. Como nem todos os objetos representam o “startup” de uma aplicação, na minha opinião, o construtor não é um bom lugar para se fazer isso.
[]'s
renatosilva
Quanto ao main, gostei da observação do Carlos, o main é uma forma de marcar uma classe como “rodável”.
Mas a primeira parada bem que os caras lá podiam facilitar as coisas. O criador do MONO disse uma vez que abandonou java por que os usuários não eram ouvidos. Por isso falo que às vezes Java parece um T-Rex com artrose. Vamo enviar uma sugestão de JSR para colocar o static direto na classe :mrgreen:
renatosilva
caiofilipini:
Construtores foram feitos para inicializar objetos. Como nem todos os objetos representam o “startup” de uma aplicação, na minha opinião, o construtor não é um bom lugar para se fazer isso.
[]'s
Concordo
Luca
Olá
Só para lembrar: member classes podem e sempre que possível devem ser declaradas como estáticas.
[]s
Luca
Thiago_Senna
Além do que o caio disse, tem outro problema!
Você não conseguirá usar nenhum método deste objeto antes o contrutor termine de ser executado! Mais um motivo para não iniciar a aplicação no construtor!
danieldestro
Thiago Senna:
Além do que o caio disse, tem outro problema!
Você não conseguirá usar nenhum método deste objeto antes o contrutor termine de ser executado! Mais um motivo para não iniciar a aplicação no construtor!
Como não?
public class T {
public T() {
shitHappens();
}
public void shitHappens() {
}
}
Thiago_Senna
Oloco!!!
Bom… vamos ao esclarecimentos!!!
:arrow: “Os métodos e variáveis de instância só podem ser acessados depois de o contrutor da super classe ser executado.”
Livro da Kath Sierra!, página 214.
Bom, pelo que vi, acho que eu pisei na bola… não se trata do próprio contrutor do objeto, e sim do contrutor de sua classe pai!
Foi Mau!!
Abraços!
louds
Luca:
Olá
Só para lembrar: member classes podem e sempre que possível devem ser declaradas como estáticas.
[]s
Luca
E depois quando precisarem voltar a ser instance methods você vai se perguntar porque o tiro no pé doi.
Uma opção razoavel que é permitir que classes implementando Runnable sejam executadas
newX().run();
danieldestro
Thiago Senna:
:arrow: “Os métodos e variáveis de instância só podem ser acessados depois de o contrutor da super classe ser executado.”
Livro da Kath Sierra!, página 214.
Bom, pelo que vi, acho que eu pisei na bola… não se trata do próprio contrutor do objeto, e sim do contrutor de sua classe pai!
Nesse caso você está se referindo a classes que são usadas externamente. Ex:
X.java
//...
Y y =new Y();
y.algumMetodo();
renatosilva
Do que o louds e o Luca estão falando? O que são member classes?
Luca
Olá
Lembre-se que eu disse sempre que possível. E é claro que no caso da member class não precisar ter acesso a instância da classe que a engloba. Normalmente ninguém escreveria um Adapter com uma static member class.
Mas quando isto é possível, é altamente recomendável sob o ponto de vista de economia de recursos e também por clareza de código. Principalmente se serão construídas muitas instâncias da classe externa. É a solução adotada na interface Map.Entry.
Member classes não são muito usadas pela maioria dos programadores mas para mim é uma das coisas boas do Java. Serve para confinar código exatamente onde ele é requisitado. Eu não gosto de código swing quando o programador pensa que fica mais claro escrevendo os listeners sem usar member classes.
Mas é claro que se uma refatoração exigir que se volte a instance methods isto só pode ser exequível se a classe ainda não foi publicada sua documentação ou ainda se ela não se propagou demais pelos sistemas da empresa.
[]s
Luca
Luca
Olá
member class = inner class = classe interna = classe declarada dentro de outra classe
Podem ser:
static member classes = usam static, não existe uma instância dela para cada instância da classe que a engloba. Não podem acessar instâncias da classe que a engloba.
member classes = classes comuns, apenas que ficam dentro de outras
anonymous classes = classes comuns, apenas que ficam dentro de uma expressão
local classes = classes comuns, apenas que ficam dentro de um método
Dada as características do local de definição de cada tipo podem haver restrições ao que cada classe interna pode acessar ou o que dela pode ser acessado pela classe que a contém ou por outras classes do sistema.