2015-08-12 3 views
1

Я хочу реализовать метод, который преобразует коллекцию или карту в массив байтов. Так что я написал этот отрывок:Как я могу дублировать поведение для разных экземпляров интерфейса?

public static byte[] getByteArray(Collection<?> coll) { 
    ByteArrayOutputStream baos = null; 
    ObjectOutputStream oos = null; 

    try { 
     baos = new ByteArrayOutputStream(); 
     oos = new ObjectOutputStream(baos); 
     oos.writeObject(coll); 
    } catch (IOException e) { 
     e.printStackTrace; 
    } finally { 
     closeAll(baos, oos); 
    } 

    return baos.toByteArray(); 
} 

Потом я обнаружил, что Map doesn't extend Collection, следовательно, я не могу иметь один и тот же метод. Должен ли я действительно писать другой метод с тем же кодом, поскольку у них нет общих интерфейсов? Например:

public static byte[] getByteArray(Map<?, ?> map) { 
    ByteArrayOutputStream baos = null; 
    ObjectOutputStream oos = null; 

    try { 
     baos = new ByteArrayOutputStream(); 
     oos = new ObjectOutputStream(baos); 
     oos.writeObject(map); 
    } catch (IOException e) { 
     e.printStackTrace; 
    } finally { 
     closeAll(baos, oos); 
    } 

    return baos.toByteArray(); 
} 

Или, может быть, я должен использовать другое решение, например, литье коллекций и карт в Object? Как это:

public static byte[] getByteArray(Collection<?> coll) { 
    return getByteArray((Object) coll); 
} 

public static byte[] getByteArray(Map<?, ?> map) { 
    return getByteArray((Object) map); 
} 

public static byte[] getByteArray(Object obj) { 
    ByteArrayOutputStream baos = null; 
    ObjectOutputStream oos = null; 

    try { 
     baos = new ByteArrayOutputStream(); 
     oos = new ObjectOutputStream(baos); 
     oos.writeObject(obj); 
    } catch (IOException e) { 
     e.printStackTrace; 
    } finally { 
     closeAll(baos, oos); 
    } 

    return baos.toByteArray(); 
} 

Я считаю, что первое решение, очевидно, плохой выбор, и последний является немного странным.

Есть ли альтернативы?

ответ

3

Просто используйте свой третий фрагмент кода, но без первых двух методов; они не нужны.

ObjectOutputStream.writeObject принимает Object, и все, что вы действительно делаете, это перенос такого поведения с помощью очистки ресурсов. Нет ничего по своей сути неправильно использовать Object для вещей; в то время как обычно это не то, что вы хотите, иногда это так, как в этом случае.

Смежные вопросы