Diferença entre namespace em C # e pacote em Java

98

Qual é a diferença (em termos de uso) entre namespaces em C # e pacotes em Java?

Mazzy
fonte

Respostas:

74

De: http://www.javacamp.org/javavscsharp/namespace.html


Java

Os pacotes são usados ​​para organizar arquivos ou tipos públicos para evitar conflitos de tipo. As construções de pacote podem ser mapeadas para um sistema de arquivos.

system.security.cryptography.AsymmetricAlgorithm aa;

pode ser substituído:

import system.security.Crypography; 
class xxx { ...
AsymmetricAlgorithm aa;

Não há alias para pacotes. Você deve usar a instrução import ou um nome totalmente qualificado para mencionar o tipo específico.

package n1.n2;
    class A {}
    class B {}

ou

package n1.n2;
   class A {}

Outro arquivo de origem:

package n1.n2;
   class B {}

O pacote não pode ser aninhado. Um arquivo de origem pode ter apenas uma instrução de pacote.

C #

Os namespaces são usados ​​para organizar programas, tanto como um sistema de organização "interno" para um programa e como um sistema de organização "externo".

System.Security.Cryptography.AsymmetricAlgorithm aa;

pode ser substituído:

using System.Security.Crypography; 
AsymmetricAlgorithm aa;

Como alternativa, pode-se especificar um alias para o namespace, por exemplo

using myAlias = System.Security.Crypography; 

e, em seguida, consulte a aula com

myAlias.AsymmetricAlgorithm 

namespace N1.N2
{
    class A {}
    class B {}
}

ou

namespace N1
{
    namespace N2
    {
        class A {}
        class B {}
    }
}
RuudVanNistelrooy
fonte
3
ótima resposta, mas a importação de java não vai funcionar, eu acho. Deve ser import system.security.crypography.AsymmetricAlgorithm;. Já que em java você tem que importar uma classe, não um pacote. É possível importar todas as classes em um pacote com um, import package.*mas isso também importa as classes, não o pacote.
Imus
existe uma maneira de namespace em Java sem usar tantas pastas? Uma namespacepalavra-chave em Java seria bom.
42

Existem alguns detalhes que diferem.

Em Java, a estrutura do diretório deve corresponder à estrutura do pacote. Essa restrição não existe em C #.

Em C #, você pode ter vários namespaces em um arquivo. Em Java, um arquivo pertence a um pacote (ver anterior).

Java tem acessibilidade padrão / pacote. Acessibilidade interna C # vai em assemblies.

Se você usar VS e Eclipse e deixá-los estruturar o projeto, não sentirá muito as diferenças.

Acaz Souza
fonte
35

Não existe um termo como "namespace" em Java - um pacote atua como um namespace em Java, no entanto, em termos de fornecer um escopo para nomes. Também faz parte do modelo de acessibilidade.

Da seção 7 da Especificação da linguagem Java :

Os programas são organizados como conjuntos de pacotes. Cada pacote tem seu próprio conjunto de nomes para tipos, o que ajuda a prevenir conflitos de nomes. Um tipo de nível superior está acessível (§6.6) fora do pacote que o declara somente se o tipo for declarado público.

EDIT: Ok, após o esclarecimento: um pacote Java é semelhante a um namespace C # - exceto que tem um impacto na acessibilidade, enquanto em C # namespaces e acessibilidade são inteiramente ortogonais.

Jon Skeet
fonte
12

Em C ++ / C #, os namespaces são usados ​​apenas para nomes de particionamento para evitar colisões ao usar acidentalmente o mesmo nome para uma variável em locais diferentes.

Em Java, os pacotes são muito mais do que apenas isso - os pacotes são usados ​​para módulos, o aspecto de nomenclatura é apenas uma parte dele.

kba
fonte
0

Em java, você pode aplicar vários especificadores de acesso a classes que terão impacto em seus pacotes.

protegido: acessível ao mesmo pacote e às suas subclasses em outro pacote, padrão: acessível ao mesmo pacote, público: universalmente acessível, privado: nem mesmo acessível pelo mesmo pacote.

Este tipo de especificadores de acesso não são aplicáveis ​​ao namespace em c sharp

dasumohan89
fonte
-2

Um namespace é como uma nova pasta, todas as subpastas são sub-namespaces. Se considerarmos um namespace como uma função, como se tivéssemos um namespace anunciando sob o namespace de marketing, usaremos marketing.advertising.adsclass.adsmethod. Muito fácil de resolver um problema. Java tem o mesmo método via pacote, mas complexo para iniciantes.

Em C #

'' 'marketing de namespace {

           class admissions{
                     int admissions_method(){
                     }
           }
     namespace advertising{
           class  advertisement{
                    void ad_in_newspaper( int no_of_lines){
                    }
                    void ad_on_tv(int seconds){
                    }

     }

}

Para usar na classe cliente

using marketing;
using marketing.advertising;

'' 'Em java você usa o mesmo método. Você empacota várias classes em um pacote e o usa muitas vezes. Aumenta a singularidade. Você escreve uma vez e usa muitas vezes. Classes relacionadas em um pacote. Não há necessidade de codificar muitas vezes.

Rashid Irshad
fonte
2
A questão é sobre a diferença entre namespaces em C # e pacotes em Java. Esta resposta não aborda isso de forma alguma.
Johan