使用方法重载处理违反“ Liskov替换原理”的类

60英尺

假设我有以下课程:

public class MyClass {

    /* Note: Timestamp extends date */
    public doSomething(java.sql.Timestamp timestamp){
        System.out.println("Timestamp");
        ...
    }

    public doSomething(java.util.Date date){
        System.out.println("Date");
        ...
    }
}

假设我现在像这样执行我的代码:

MyClass myClass = new MyClass();

Date realDate = new Date();
Timestamp timestamp = new Timestamp(0);
Date casted = new Timestamp(0);

myClass.doSomething(realDate);      // prints Date
myClass.doSomething(timestamp);     // prints Timestamp
myClass.doSomething(casted);        // prints Date!!!!!  What?!

我遇到的问题是,由于casted实际上不是日期,因此在我使用它时不起作用。

撇开:通常,不起作用的子类应该不是问题,但是Timestamp的javadoc说:

由于上述Timestamp类和java.util.Date类之间的差异,建议代码不要以java.util.Date的实例的形式一般性地查看Timestamp值。Timestamp和java.util.Date之间的继承关系实际上表示实现继承,而不是类型继承。

我知道我可以做这样的事情:

public doSomething(java.util.Date date){
    if(date instanceof type){
        System.out.println("Timestamp");
        ...
    }
    System.out.println("Date");
    ...
}

但这似乎令人讨厌。

有没有一种方法可以使子类的方法重载在不使用巨型switch语句的情况下起作用?


编辑:总而言之,这似乎Timestamp违反了Liskov替换原则-如@Mick Mnemonic所指出的

安德鲁·扬克

是的。不是你的虫子。它的设计怪癖java.util.Datejava.sql.DateTimestamp(不要太在乎他们。java.util.Date现在已经20岁了;他们在设计API时仍在弄清楚这些内容。)如果直接使用这些类型,则没有很好的解决方法。

一种方法是避免使用这些类,除非您必须在需要它们的API的边界处使用它们,而在其他地方使用一组设计更好的日期时间类型。在数据访问层中,必要时Timestamp使用特殊情况instanceof并将所有内容转换java.time为内部代码的Joda-Time(对于Java 7)或/ JSR-310(对于Java 8)类型。(如果您实际上需要Java 7中的纳秒精度,则需要滚动自己的Timestamp对象以使用Joda-Time类型。不难;只需确保使用合成而不是像java.util人们那样实现继承!:) )您可能会更快乐。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Liskov替换原理和使用继承类的正确方法

来自分类Dev

在子类中添加公共方法是否违反LSP(Liskov替换原理)?

来自分类Dev

在子类中添加公共方法是否违反LSP(Liskov替换原理)?

来自分类Dev

在SharedFolder中违反Liskov替换原则

来自分类Dev

从 GraphNode 派生 BinaryTreeNode 是否违反了 Liskov 的替换原则

来自分类常见问题

Mypy产生不兼容的签名错误,但满足了Liskov替换原理

来自分类Dev

Liskov替换原理与常规继承有何不同?

来自分类Dev

Mypy产生不兼容的签名错误,但满足了Liskov替换原理

来自分类Dev

对空类使用方法

来自分类Dev

Liskov替代原理示例

来自分类Dev

错误的接口实现是否违反了 Liskov 替换原则?

来自分类Dev

使用方法创建超类

来自分类Dev

使用方法创建超类

来自分类Dev

Python创建类和使用方法

来自分类Dev

使用方法依赖测试 util 类

来自分类Dev

在重载的类方法上使用std :: bind()

来自分类Dev

使用方法参考替换链接的方法调用

来自分类Dev

使用方法结果时违反dafny断言

来自分类Dev

jQuery使用方法replaceWith()替换输入占位符

来自分类Dev

如何使用方法替换特定字符串?

来自分类Dev

PHP中的类字段和方法的工作原理

来自分类Dev

类中的重载方法

来自分类Dev

如何在不违反C ++中的DRY原理的情况下实现可移动重载?

来自分类Dev

声明后使用方法扩展类功能

来自分类Dev

使用方法作为事件监听器而不是类

来自分类Dev

在派生类中不使用方法

来自分类Dev

在ruby类中使用方法进行迭代

来自分类Dev

如何在类中使用方法或执行语句

来自分类Dev

如何使用方法“包含”?类Mongoid :: Criteria的类别?

Related 相关文章

热门标签

归档