Devrais-je mettre une interface publique dans un fichier séparé?
J'ai le code suivant:
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 public et il doit être déclarée dans un fichier appelé "IServiceAnnouncer.java".
J'ai plusieurs questions à ce sujet:
- Pourquoi le compilateur dire que
IServiceAnnouncer
est une classe? C'est une interface. Interface ou partielle cas d'une classe? - Si je mets de l'interface
IServiceAnnouncer
dans un fichier séparé appelé "IServiceAnnouncer.java" (comme le compilateur veut), alors comment puis-je l'utiliser à partir de l' "HelloWorld.java"? - Ce n'
public interface
veux dire? Quelle est la différence entre une interface publique et non publique?
source d'informationauteur Roman | 2010-03-05
Vous devez vous connecter pour publier un commentaire.
Vous pouvez le mettre dans un fichier séparé. De cette façon, il est plus facile pour échanger dans une autre mise en œuvre, ou de rendre les interfaces de l'API de votre système) disponible pour les autres à coder sans connaître les détails de votre mise en œuvre, ou d'avoir à glisser dans les dépendances connexes.
par exemple implémentations de communes des Api Java - par exemple, les servlets - a la mise en œuvre codée sur le paquet des interfaces fournies par le Soleil (dans ce cas
javax.servlet
)Comment pouvez-vous utiliser à partir de votre mise en œuvre ? Par l'importation. Ce n'est pas nécessaire si c'est dans le même paquet et vous êtes à la compilation de tous vos interfaces et implémentations à la fois.
Noter qu'une interface compile vers le bas à un .fichier de classe de la même manière qu'une mise en œuvre (ce que vous définissez à l'aide de
class
).Vous n'avez pas le choix. Tous les classes/interfaces doivent être dans les fichiers nommés ClassOrInterfaceName.java.
Ces réponses sont à danser autour de la droite.
C'est très étrange en Java pour déclarer plusieurs classes dans un même fichier, même si vous pouvez. Ne pas le faire.
Vous mettre IServiceAnnouncer dans un fichier séparé, et à l'importation le nom de la classe dans HelloWorld.java. Il vous suffit simplement de les compiler en même temps, en passant les deux noms de fichier à javac. Que toutes les œuvres.
Une interface publique, comme pour tout ce qui est public en Java, est un type qui est visible et utilisable à partir de n'importe quel autre classe. Sans "public", sa visibilité est appelé package-privé, ce qui signifie que seules les choses dans le même paquet peut l'utiliser.
Le compilateur utilise le terme de "classe" un peu lâche. Un terme plus général pourrait être de "type". Je suppose que le compilateur utilise le terme de "classe" parce qu'elle produit ".catégorie" fichiers du même format de chaque déclaration de type (
class
interface
etenum
).Une interface n'a pas à être
public
. Si elle est déclarée sans un modificateur d'accès, il peut être accessible uniquement à l'intérieur de son "package".Un type Java peut (doit) être déclaré dans un package. Les paquets sont une collection de types Java qui devraient être construits et déployés. Par défaut, tous les types de paquet sont implicitement importés, donc si votre interface est dans le même paquet, il sera disponible à la
HelloWorld
classe.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 le
IServiceAnnouncer
interface dans un fichier séparé, il sera disponible àHelloWorld
. Juste compiler les deux fichiers en même temps.Le problème avec plus d'une classe de définition dans un fichier d'erreur suivants, qui peuvent se produire lors de l'utilisation de la gestion des versions et plusieurs développeurs travaillent sur le même projet:
Ainsi, il est préférable de placer le public (et aussi non-public, btw) des classes dans des fichiers séparés. Cela permettra de réduire les chances d'avoir ces erreurs.
Si c'est dans le même dossier, il suffit d'utiliser la
IServiceAnnouncer
si elle est dans un autre dossier,import
.public
est visible de tous les paquets. Pas depublic
signifie une sorte deprotected
(alors que le mot-cléprotected
est interdite, bizarre hein!): il n'est visible que de l'intérieur de la même package. Si vous n'êtes pas sûr de ce qu'un package, consultez le Tutoriel Java. http://java.sun.com/docs/books/tutorial/java/package/packages.html1) Le compilateur est juste pour se plaindre que vous avez 2 public de haut niveau de la définition des types. Vous ne pouvez pas le faire en Java. Vous pouvez imbriquer l'interface dans votre classe si vous le souhaitez, ou de le rendre public (visibilité par défaut), mais ce n'est pas trop commun en Java, et probablement pas très utile ici.
2) Vous devrez implémenter l'interface, ou avoir accès à un objet qui met-il en œuvre.
3) les Interfaces peuvent être soit public, ou par défaut (package) de la visibilité. Méthodes de l'interface n'ont pas besoin du public modificateur ils sont publics par défaut.