Should I put a public interface in a separate file?

Roman picture Roman · Mar 5, 2010 · Viewed 18.9k times · Source

I have the following code:

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

This code is saved in a file called "HelloWorld.java". The Java compiler complains about this code. It writes that the class IServiceAnnouncer is public and it should be declared in a file called "IServiceAnnouncer.java".

I have several questions about this:

  1. Why would the compiler say that IServiceAnnouncer is a class? It's an interface. Or interface is a partial case of a class?

  2. If I put the interface IServiceAnnouncer in a separate file called "IServiceAnnouncer.java" (as the compiler wants), how then can I use it from the "HelloWorld.java"?

  3. What does public interface mean? What is the difference between a public interface and non-public one?

Answer

Brian Agnew picture Brian Agnew · Mar 5, 2010

You should put it in a separate file. That way it's easier to swap in a different implementation, or make the interfaces (the API of your system) available for others to code against without knowing the details of your implementation, or having to drag in related dependencies.

e.g. implementations of common Java APIs - e.g. servlets - will have an implementation coded against the package of interfaces provided by Sun (in this case javax.servlet)

How can you use it from your implementation ? By importing it. This is unnecessary if it's in the same package and you're compiling all your interfaces/implementations at once.

Note that an interface compiles down to a .class file in the same way as an implementation (what you define using class).