2012-05-14 4 views
1

В настоящее время есть фрагмент кода, который в настоящее время выглядит как сериализованные/десериализованные данные.Переопределение кода рефакторинга

Классовая структура выглядит следующим образом:

public class Field 
{ 
    public abstract void writeField(DataOutputStream out); 

    public abstract int getFieldID(); 

    ... 

    protected static final int INT_FIELD = 1; 
    protected static final int BOOL_FIELD = 2; 

    ... 

    public void write(DataOutputStream out) 
    { 
     out.writeInt(getFieldID()); 
     writeField(out); 
    } 

    ... 
} 

public class IntField extends Field 
{ 
    public int v; 

    public void writeField(DataOutputStream out) 
    { 
     out.writeInt(v); 
    } 

    public int getFieldID() 
    { 
     return Field.INT_FIELD; 
    } 
} 

Я чувствую себя, как GetFieldID реализуется не является лучшим.

Написание абстрактного метода для возврата уникального идентификатора для этого класса кажется неприятным запахом.

Есть ли более эффективные способы реализации этого?

+0

Смотрите мой ответ, если это то, что вы хотите. – nnhthuan

ответ

3

Перечисление подкласса-специфических констант в базовом классе - не такая уж большая идея, потому что в идеале суперкласс не должен знать о своих подклассах. Просто перечисление констант в базе не так плохо, как с использованием их для различия между подклассами в коде базового класса.

В идеале вы должны переместить константы в соответствующие подклассы. Если вы не можете сделать это, не нарушая компиляцию, вы действительно наткнулись на главного кандидата на рефакторинг.

+0

Я предполагаю, что проблема в том, что вы можете столкнуться с идентификаторами полей, которые будут сталкиваться. Поскольку нет централизованного списка идентификаторов полей, вы можете в конечном итоге объявить идентификатор поля одним и тем же в двух отдельных подклассах. – Brad

0

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

У вас может быть интерфейс, который реализован в классе реализации, где все методы, объявленные в интерфейсе, реализованы в классе реализации. Этот метод еще один вкус наследования известен как наследование интерфейса. Это уменьшает жесткую связь между суперклассом и подклассом.

3

Вы можете определить класс с помощью Generics. Как это:

поле

import java.io.DataOutputStream; 

public abstract class Field<T extends Object> { 
    public abstract void writeField(DataOutputStream out); 
    public abstract T getValue(); 
    public abstract Class<T> getFieldClass(); 
} 

IntField

import java.io.DataOutputStream; 
import java.io.IOException; 

public class IntField extends Field<Integer> { 
    public Integer v; 

    @Override 
    public void writeField(DataOutputStream out) { 
     try { 
      out.writeChars(v.toString()); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public Integer getValue() { 
     return v; 
    } 

    @Override 
    public Class<Integer> getFieldClass() { 
     return Integer.class; 
    } 
} 
+0

При чтении данных из файла, как вы определяете, какой объект создать, чтобы читать нужную информацию? В файле нет идентифицирующей информации, правильно? – Brad

+0

Вы можете определить структуру самостоятельно, чтобы определить тип файла. :) – nnhthuan

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