Por que um arquivo de origem Java possui o nome da classe pública que ele contém?

14

Eu sou um novato aprendendo Java. Em Java, todo arquivo de origem deve conter uma classe pública e esse arquivo de origem deve ter o mesmo nome que essa classe pública. Além disso, nenhum arquivo de origem pode conter duas classes públicas. Por que essa restrição?

do utilizador
fonte
4
Sem os detalhes, esse é um artefato de design histórico da maneira como o Java foi projetado. Linguagens projetadas mais recentemente, como C #, embora semelhantes a Java, não possuem essa restrição.
gahooa
13
Não é para aplicar as melhores práticas? Eu pensei que este era o único motivo. No C #, você não tem essa restrição no nível técnico, mas ainda assim o StyleCop reclamará se o nome do arquivo e o nome da classe não corresponderem ou se você tiver várias classes no mesmo arquivo. O Visual Studio também incentiva fortemente a relação arquivo-classe (pense em diagramas de classe que criam arquivos para você ou, quando você renomeia o arquivo .cs, o Visual Studio pergunta se você deseja refatorar o nome da classe também).
Arseni Mourzenko
Em uma linguagem compilada no estilo antigo, o vinculador encontra todas as referências e símbolos externos. Mas o Java não está vinculado - você pode carregar os frascos em tempo de execução, se desejar. Sem uma etapa do link, tentar mapear nomes de classes para locais no caminho de classe é muito mais rápido se você souber qual nome de arquivo procurar.
Paul Tomblin
4
@gahooa não é um artefato de design, é uma decisão deliberada de design. Isso facilita muitas coisas.
1
Que tal usar grep ?
usuário

Respostas:

19

Em um dos boletins de notícias de seus especialistas em Java, Heinz Kabutz examina as especificações da linguagem Oak . Ele escreve:

Por que cada classe pública está em um arquivo separado? (Seção 1)

Essa é uma pergunta que me fazem frequentemente durante meus cursos. Até agora eu não tive uma boa resposta a esta pergunta. Na seção 1, lemos: "Embora cada unidade de compilação Oak possa conter várias classes ou interfaces, no máximo uma classe ou interface por unidade de compilação pode ser pública".

Na barra lateral, explica o motivo: "Essa restrição ainda não foi aplicada pelo compilador, embora seja necessária para a importação eficiente de pacotes"

É bastante óbvio - como a maioria das coisas acontece quando você conhece os motivos do design - o compilador precisaria fazer uma passagem adicional por todas as unidades de compilação (arquivos .java) para descobrir quais classes estavam, e isso tornaria a compilação ainda mais lenta .

http://www.javaspecialists.eu/archive/Issue055.html

Landei
fonte
1
Para tornar a compilação marginalmente mais rápida? Verdade? Não porque isso torna seu código muito mais organizado? Eu duvido muito que esta seja a resposta correta.
BlueRaja - Danny Pflughoeft 16/01
1
@ BlueRaja-DannyPflughoeft Em 1998, eu tenho certeza que isso fez uma diferença muito maior
TheLQ
8

Razões em que consigo pensar

  • Facilita a localização de outras classes um pouco mais fácil para o compilador no início, uma vez que ele não precisa pesquisar todos os milhares de arquivos de classe em potencial para uma classe pública aleatória; ele pode simplesmente ir para o arquivo.
    • Provavelmente isso não importa mais, mas apenas comecei a convenção inicial que nunca mudou
  • Na compilação, uma alteração em um arquivo afeta apenas esse arquivo. Se houver várias classes, tudo deverá ser recompilado
  • Prática recomendada - Ter várias classes públicas no mesmo arquivo torna as coisas confusas. O objetivo dos arquivos é organizar o código fonte, o objetivo das pastas é organizar os arquivos. Se todas as classes de um pacote específico estão em um único super arquivo de 100 MB, você perdeu todas as vantagens e não ganhou nenhum dos benefícios dos arquivos (além de adicionar muita dor de cabeça ao editar)
TheLQ
fonte
1
Classes e interfaces não representam necessariamente o nível mais natural de subdivisões para o código-fonte. Ter milhares de linhas de código agrupadas em um arquivo é inconveniente, mas também não é possível ter nem 100 linhas de conteúdo "real" (excluindo comentários ou diretivas duplicadas do compilador) espalhadas por uma dúzia de arquivos de origem. Eu me pergunto como ele iria trabalhar se um arquivo nomeado para o tipo tinha que quer conter a definição ou então identificar o arquivo que faz?
Supercat 22/03