【问题标题】:Refactoring type code override重构类型代码覆盖
【发布时间】:2012-05-14 03:26:52
【问题描述】:

我目前正在查看一段代码,它可以序列化/反序列化数据。

类结构如下所示:

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 的实现方式并不是最好的。

编写一个抽象方法来返回该类的唯一标识符感觉很糟糕。

有没有更好的方法来实现这一点?

【问题讨论】:

  • 如果你想要的话,看看我的回答。

标签: java refactoring hierarchy


【解决方案1】:

在基类中列出特定于子类的常量并不是一个好主意,因为理想情况下,超类不应该知道它的子类。仅仅列出基类中的常量并不像使用它们来区分基类代码中的子类。

理想情况下,您应该将常量移动到它们各自的子类中。如果你不能在不破坏编译的情况下做到这一点,那么你确实偶然发现了重构的主要候选者。

【讨论】:

  • 我想问题在于您可能会遇到会发生冲突的字段 ID。因为没有集中的字段 ID 列表,您最终可能会在两个单独的子类中将字段 ID 声明为相同。
【解决方案2】:

您可以使用泛型定义一个类。 像这样:

字段

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();
}

内部字段

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;
    }
}

【讨论】:

  • 从文件中读回数据时,如何确定要创建什么对象才能读入正确的信息?文件中没有识别信息,对吗?
  • 您可以自己定义结构来识别文件的类型。 :)
【解决方案3】:

除了使用在子类中重写的超类抽象方法使用实现继承之外,可以使类紧密耦合。

您可以拥有一个在实现类中实现的接口,其中接口中声明的所有方法都在实现类中实现。这种方法是另一种继承方式,称为接口继承。这减少了超类和子类之间的紧密耦合。

【讨论】:

    猜你喜欢
    • 2018-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    相关资源
    最近更新 更多