静态方法嗜血

时间:2010-12-14 09:40:28

标签: java design-patterns

我有一个父类,其中包含从db编写和读取它的方法。问题是我有一个静态方法,我想概括。这样做的最佳做法是什么?我想出了一些解决方案,但都不能使用静态方法。

有没有办法强制子对象实现抽象方法?

父类:

public class Data_object  {

    public byte[] toByteArray() throws IOException  {
        return null;
    }
    public static Data_object fromByteArray(byte[] data){
        return null
    }
}

儿童班:

public class ModelObject extends Data_object {

    public static Data_object fromByteArray(byte[] data){
        ModelObject result = new ModelObject();
        //set data from byte arrray
        return result;
    }
}

感谢

3 个答案:

答案 0 :(得分:4)

Java中的静态方法不能是abstract,您无法覆盖它。所以你不能强迫子类实现某个静态方法。

唯一的出路是按惯例要求静态方法(如伴随JavaDoc中的注释)并使用反射来确保在运行时(或在构建时),子类实现所需的静态方法。


BTW - 这是一种常见的“模式”。 Serializable没有定义任何方法,但它的文档提到了三种方法:

private void writeObject(java.io.ObjectOutputStream out)
   throws IOException
private void readObject(java.io.ObjectInputStream in)
   throws IOException, ClassNotFoundException;
private void readObjectNoData() 
   throws ObjectStreamException;

“对象序列化框架”现在使用反射来测试,如果这些方法是由类实现的,如果是,则调用这些方法。

但我建议在之前使用此策略寻找其他解决方案

答案 1 :(得分:2)

无法覆盖静态方法。您只能通过在子类中定义具有相同名称和签名的方法来隐藏超类方法,但它非常混乱,因此通常不建议使用。例如,((SuperClassName) subClassInstance).staticMethod()可以访问原始的超类方法。

在你的情况下,最好让方法非静态。

答案 2 :(得分:1)

继承不适用于那种静态方法。您可以在特定类上调用静态方法,如下所示:

MonkeyModelObject.fromByteArray(data)

即使您从一个类的“内部”执行此操作,您仍然会在该特定类上调用该特定方法。因此,如果您“覆盖”静态方法,那么您只是在另一个类(子类)中创建一个具有相同名称的新方法。静态方法没有运行时选择方法。

对于您正在处理的特定情况,您似乎正在从/到字节数组进行序列化。也许你是从网络流中序列化消息,或类似的东西?我会推荐以下方法,也许这个伪代码可以激发你的灵感:

abstract class Message
{
    void write(stream)
    {
        stream.write(getMessageTypeCode());
        writeParameters(stream);
    }
    abstract int getMessageTypeCode();
    abstract void writeParameters(stream);
    abstract void readParamters(stream);
}
class ChatMessage
{
    String text;
    int getMessageTypeCode() { return 1; }
    void writeParameters(stream)
    {
        stream.write(text);
    }
    void readParameters(stream)
    {
        text = stream.read();
    }
}
class MessageDecoder
{
    Message decode(stream)
    {
        int type = stream.read();
        message = createMessage(type);
        message.readParameters(stream);
        return message;
    }
    Message createMessage(int type)
    {
        if (type == 1)
        {
            return new ChatMessage();
        }
        throw new error;
    }
}