Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Should I put a public interface in a separate file?

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?

like image 791
Roman Avatar asked Mar 05 '10 21:03

Roman


2 Answers

These answers are dancing around the right one.

  1. Yes, you can declare multiple classes in one file in Java.
  2. You cannot declare more than one public class, because:
  3. A public class's name must match its containing file name; this is your compile error

It is very strange in Java to declare multiple classes in one file, even though you can. Don't do it.

You put IServiceAnnouncer in a separate file, and import the class name in HelloWorld.java. You merely compile them at the same time, passing both file names to javac. That all works.

A public interface, like anything else that's public in Java, is a type that's visible and usable from any other class. Without "public", its visibility is called package-private, which means only things in the same package can use it.

like image 180
Sean Owen Avatar answered Nov 15 '22 13:11

Sean Owen


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).

like image 25
Brian Agnew Avatar answered Nov 15 '22 11:11

Brian Agnew