2010-03-05 5 views
9

J'ai le code suivant:Devrais-je mettre une interface publique dans un fichier séparé?

import com.apple.dnssd.*; 

public interface IServiceAnnouncer { 
    public void registerService(); 
    public void unregisterService(); 
    public boolean isRegistered(); 
} 

class HelloWorld { 
     public static void main(String[] args) { 
       System.out.println("Hello, World!"); 
     } 
} 

Ce code est enregistré dans un fichier appelé "HelloWorld.java". Le compilateur Java se plaint de ce code. Il écrit que la classe IServiceAnnouncer est publique et doit être déclarée dans un fichier appelé "IServiceAnnouncer.java".

J'ai plusieurs questions à ce sujet:

  1. Pourquoi dirait le compilateur que IServiceAnnouncer est une classe? C'est une interface. Ou l'interface est un cas partiel d'une classe? Si je mets l'interface IServiceAnnouncer dans un fichier séparé appelé "IServiceAnnouncer.java" (comme le veut le compilateur), comment puis-je l'utiliser depuis "HelloWorld.java"?

  2. Que signifie public interface? Quelle est la différence entre une interface publique et une interface publique?

+0

Sans rapport avec votre question, mais selon les normes de codage Java standard, vous devez placer "I" devant les interfaces. –

+1

@Steve Kuo: Bon conseil, mais vous avez peut-être un mot. :-) http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html – trashgod

Répondre

13

Vous devriez le mettre dans un fichier séparé. De cette façon, il est plus facile d'échanger une implémentation différente, ou de rendre les interfaces (l'API de votre système) accessibles aux autres utilisateurs sans connaître les détails de votre implémentation, ou d'avoir à faire glisser les dépendances associées.

par exemple. implémentations d'API Java communes - par ex. servlets - aura une implémentation codée par rapport au paquet d'interfaces fourni par Sun (dans ce cas javax.servlet)

Comment pouvez-vous l'utiliser à partir de votre implémentation? En l'important. Ceci est inutile si c'est dans le même paquet et que vous compilez toutes vos interfaces/implémentations à la fois.

Notez que l'interface compile vers le bas dans un fichier .class de la même manière que d'une mise en œuvre (ce que vous définissez à l'aide class).

+3

Les interfaces ne doivent pas forcément être publiques. Ils peuvent être utiles dans un package, ou même en privé dans une classe (j'ai fait cela pour le modèle d'état). – erickson

+0

Bien sûr! Doh. Corrigée. Thx –

6

Vous n'avez pas le choix. Toutes les classes/interfaces publiques doivent être dans des fichiers nommés ClassOrInterfaceName.java.

0
  1. Le problème avec plus d'une définition de classe dans un seul fichier est l'erreur suivante, qui peut se produire lors de l'utilisation développeurs Versioning et plusieurs travaillent sur le même projet:

    duplicate class: X 
    class X { 
    

    Ainsi, il est a préféré placer les classes publiques (et aussi non-publiques, btw) dans des fichiers séparés. Cela réduira la possibilité d'avoir ces erreurs.

  2. Si c'est dans le même dossier, utilisez simplement le IServiceAnnouncer, s'il se trouve dans un autre dossier, import.

  3. public est visible à partir de tous les packages. Non public signifie une sorte de protected (alors que le mot-clé protected est interdit, bizarre hein!): Il est seulement visible depuis le même paquet. Si vous n'êtes pas sûr de ce qu'est un paquet, consultez le tutoriel Java.http://java.sun.com/docs/books/tutorial/java/package/packages.html

-1

1) Le compilateur est juste plaint que vous avez 2 types de haut niveau publics définis. Vous ne pouvez pas faire cela en Java. Vous pouvez imbriquer l'interface dans votre classe si vous le souhaitez, ou la rendre non publique (visibilité par défaut), mais ce n'est pas courant en Java, et probablement pas trop utile ici.

2) Vous aurez besoin soit d'implémenter l'interface, ou avoir accès à un objet qui le fait mettre en œuvre.

3) Les interfaces peuvent être soit public ou visibilité par défaut (package). Les méthodes d'une interface n'ont pas besoin du modificateur public car elles sont publiques par défaut.

+0

3) pas vrai: toutes les interfaces de niveau supérieur (non imbriquées) ne sont pas publiques. Ils ne sont publics que lorsqu'ils sont définis publics. Essayez-le! – Pindatjuh

+0

Oui, j'aurais dû mentionner la visibilité du paquet! – pkananen

+1

Vous pouvez définir autant de classes de niveau supérieur que vous le souhaitez en Java, c'est juste que les classes publiques doivent correspondre au nom du fichier, ce qui signifie que vous ne pouvez déclarer qu'un type public de premier niveau dans un fichier. –

1

Le compilateur utilise un peu le terme "classe". Un terme plus général pourrait être "type". Je suppose que le compilateur utilise le terme "classe" car il produit des fichiers ".class" du même format à partir de chaque déclaration de type (class, interface et enum).

Une interface ne doit pas être public. Si elle est déclarée sans un modificateur d'accès, elle est accessible uniquement dans son "package".

Un type Java peut (doit) être déclaré dans un package. Les packages sont une collection de types Java qui doivent être construits et déployés ensemble. Par défaut, tous les types d'un package sont importés implicitement. Par conséquent, si votre interface se trouve dans le même package, elle sera disponible pour la classe HelloWorld.

Lorsque vous ne déclarez pas un paquet, un type est dans le package par défaut. Donc, même si vous venez de mettre l'interface IServiceAnnouncer dans un fichier séparé, il sera disponible à HelloWorld. Compilez simplement les deux fichiers en même temps.

3

Ces réponses dansent autour de la bonne.

  1. Oui, vous pouvez déclarer plusieurs classes dans un fichier en Java.
  2. Vous ne pouvez pas déclarer plusieurs classes publiques, car:
  3. Le nom d'une classe publique doit correspondre à son nom de fichier conteneur; c'est votre erreur de compilation

Il est très étrange en Java de déclarer plusieurs classes dans un fichier, même si vous le pouvez. Ne fais pas ça.

vous mettre IServiceAnnouncer dans un fichier séparé, et importer le nom de classe dans HelloWorld.java. Vous les compilez simplement en même temps, en passant les deux noms de fichiers à javac. Tout ça fonctionne

Une interface publique, comme tout ce qui est public à Java, est un type qui est visible et utilisable de toute autre classe. Sans "public", sa visibilité est appelée package-private, ce qui signifie que seules les choses dans le même paquet peuvent l'utiliser.

Questions connexes