2010-03-05 13 views
9

Ho il codice seguente:Devo inserire un'interfaccia pubblica in un file separato?

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!"); 
     } 
} 

Questo codice viene salvato in un file chiamato "HelloWorld.java". Il compilatore Java si lamenta di questo codice. Scrive che la classe IServiceAnnouncer è pubblica e dovrebbe essere dichiarata in un file chiamato "IServiceAnnouncer.java".

Ho diverse domande su questo:

  1. Perché il compilatore dire che IServiceAnnouncer è una classe? È un'interfaccia. O l'interfaccia è un caso parziale di una classe?

  2. Se inserisco l'interfaccia IServiceAnnouncer in un file separato chiamato "IServiceAnnouncer.java" (come vuole il compilatore), come posso usarlo da "HelloWorld.java"?

  3. Che cosa significa public interface? Qual è la differenza tra un'interfaccia pubblica e una non pubblica?

+0

Non correlato alla domanda, ma per gli standard di codifica Java standard è necessario inserire "I" di fronte alle interfacce. –

+1

@Steve Kuo: buon consiglio, ma potresti avere una parola. :-) http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html – trashgod

risposta

13

Si consiglia di inserirlo in un file separato. In questo modo è più semplice scambiare un'implementazione diversa o rendere disponibili le interfacce (l'API del tuo sistema) a cui gli altri possono eseguire il codice senza conoscere i dettagli della tua implementazione o dover trascinare le dipendenze correlate.

ad es. implementazioni di API Java comuni - ad es. servlet - avrà un'implementazione codificata rispetto al pacchetto di interfacce fornito da Sun (in questo caso javax.servlet)

Come si può utilizzare dalla propria implementazione? Importandolo Questo non è necessario se si trova nello stesso pacchetto e stai compilando tutte le tue interfacce/implementazioni contemporaneamente.

Si noti che un'interfaccia si compila in un file .class allo stesso modo di un'implementazione (ciò che si definisce usando class).

+3

Le interfacce non devono essere pubbliche. Possono essere utili all'interno di un pacchetto, o anche privatamente all'interno di una classe (l'ho fatto per lo schema State). – erickson

+0

Ovviamente! Doh. Corretto. Thx –

6

Non hai scelta. Tutte le classi/interfacce pubbliche devono trovarsi in file denominati ClassOrInterfaceName.java.

0
  1. Il problema con più di una classe alta definizione in un unico file è il seguente errore, che può verificarsi quando si utilizzano versioni e più sviluppatori stanno lavorando allo stesso progetto:

    duplicate class: X 
    class X { 
    

    Così, è è preferibile inserire classi pubbliche (e anche non pubbliche, btw) in file separati. Ciò ridurrà la possibilità di avere questi errori.

  2. Se si trova nella stessa cartella, utilizzare lo IServiceAnnouncer, se si trova in un'altra cartella, import.

  3. public è visibile da tutti i pacchetti. No public significa un tipo di protected (mentre la parola chiave protected è proibita, strano eh!): È visibile solo all'interno dello stesso pacchetto. Se non sei sicuro di cosa sia un pacchetto, consulta il tutorial Java.http://java.sun.com/docs/books/tutorial/java/package/packages.html

-1

1) Il compilatore è solo lamenta di avere 2 tipi di alto livello pubbliche definite. Non puoi farlo in Java. Puoi nidificare l'interfaccia nella tua classe, se lo desideri, o renderla non pubblica (visibilità predefinita), ma non è troppo comune in Java e probabilmente non è troppo utile qui.

2) È necessario implementare l'interfaccia o accedere a un oggetto che lo implementa.

3) Le interfacce possono essere di visibilità pubblica o predefinita (pacchetto). I metodi in un'interfaccia non hanno bisogno del modificatore pubblico poiché sono pubblici per impostazione predefinita.

+0

3) non vero: non tutte le interfacce di livello superiore (non annidate) sono pubbliche. Sono pubblici solo se definiti pubblici. Provalo! – Pindatjuh

+0

Sì, avrei dovuto menzionare la visibilità del pacchetto! – pkananen

+1

È possibile definire tutte le classi di livello più alto che si desidera in Java, è solo che quelle pubbliche devono corrispondere al nome del file, il che significa che è possibile dichiarare solo un tipo pubblico di primo livello in un unico file. –

1

Il compilatore utilizza il termine "classe" un po 'alla lettera. Un termine più generale potrebbe essere "tipo". Sto indovinando il compilatore utilizza il termine "classe" perché produce file ".class" dello stesso formato da ogni dichiarazione di tipo (class, interface e enum).

Un'interfaccia non deve essere public. Se è dichiarato senza un modificatore di accesso, è possibile accedervi solo all'interno del suo "pacchetto".

Un tipo Java può (deve) essere dichiarato in un pacchetto. I pacchetti sono una raccolta di tipi Java che dovrebbero essere costruiti e distribuiti insieme. Per impostazione predefinita, tutti i tipi in un pacchetto vengono importati implicitamente, quindi se l'interfaccia si trova nello stesso pacchetto, sarà disponibile per la classe HelloWorld.

Quando non si dichiara un pacchetto, un tipo si trova nel pacchetto predefinito. Quindi, anche se hai appena messo l'interfaccia IServiceAnnouncer in un file separato, sarà disponibile per HelloWorld. Basta compilare entrambi i file allo stesso tempo.

3

Queste risposte stanno ballando intorno a quella giusta.

  1. Sì, è possibile dichiarare più classi in un file in Java.
  2. Non è possibile dichiarare più di una classe pubblica, perché:
  3. Il nome di una classe pubblica deve corrispondere al nome del file contenente; questo è il tuo errore di compilazione

È molto strano in Java dichiarare più classi in un unico file, anche se è possibile. Non farlo

Inserisci IServiceAnnouncer in un file separato e importa il nome della classe in HelloWorld.java. Li si compila semplicemente nello stesso momento, passando entrambi i nomi dei file su javac. Tutto funziona.

Un'interfaccia pubblica, come qualsiasi altra cosa pubblica in Java, è un tipo che è visibile e utilizzabile da qualsiasi altra classe. Senza "pubblico", la sua visibilità è definita pacchetto-privato, il che significa che solo le cose nello stesso pacchetto possono usarlo.

Problemi correlati