Отображение vs Интерфейс

Рейтинг: 1Ответов: 2Опубликовано: 09.02.2011

Встал перед выбором, что использовать: интерфейсы или отображения. Идея такая: у меня есть класс диспатчера, который должен принять на вход класс, вытащить информацию о нем и сереализовать его в сеть по определенному протоколу. Интересует, что лучше использовать при извлечении информации о классе - интерфейс или отображение?

Ответы

▲ 2

Используйте интерфейсы, если возможно. Reflections - очень медленно.

UPD: Пояснить трудно, потому что в общем случае через интерфейсы будет громоздко. Нужно исходить из специфики передаваемых данных.

Если вам не важен формат передачи (т.е. не нужно следовать какому-то протоколу), то просто используйте стандартную сериализацию

class MyData implements Serializable {
    private int myValue;

    // тут какой-то код....
}

class StoreStreamAction implements Runnable {
    private final OutputStream os;
    private final MyData toBeWritten;

    // ....

    public void run() {
        try {
             ObjectOutputStream objs = new ObjectOutputStream(os);
             objs.writeObject(toBeWritten);
        } catch(IOException e) {
             //....
        }

    }
}

Если же вам обязательно следовать протоколу, то тут очень важно понять специфику передаваемых данных и особенности самого протокола. В противном случае, пример получается очень уж абстрактный

interface Trasferrable {
    String getName();
    void sendToStream(OutputStream os) throws IOException;
}

class MyData implements Transferrable {
    private int myValue;

    public String getName() {
        return "[my-data]";
    }

    public void sendToStream(OutputStream os) throws IOException {
        os.write(myvalue & 0xff);
        os.write((myvalue >> 8) & 0xff);
        // .. etc
    }
}

class StoreStreamAction implements Runnable {
    private final OutputStream os;
    private final Transferrable toBeWritten;

    // ....

    public void run() {
        try {
             os.write(toBeWritten.getName().getBytes(Charset.forName("UTF-8")));
             os.write(0);
             toBeWritten.sendToStream(os);
        } catch(IOException e) {
             //....
        }
    }
}
▲ 2

однозначно интерфейс, и я очень сомневаюсь в необходимости придумывать новый велосипед когда уже все продумали до вас:

class MyData implements Serializable
{
   private static final long serialVersionUID = 3294943541140409362L;
   private int myValue;

   private void readObject ( final java.io.ObjectInputStream in )
            throws IOException, ClassNotFoundException
   {
   }

   private void readObjectNoData () throws ObjectStreamException
   {
   }

   private void writeObject ( final java.io.ObjectOutputStream out )
            throws IOException
   {
   }
}

вам необходимо реализовать эти методы, которые будут автоматически использованы JVM при сериализации (хотите вкрутить свой велосипед? используйте шаблон прокси и выносите реализацию этих методов в другой класс, а там... "хоть трава не рости")