Encapsulate Downcast (封装向下转型)

Summary: 

某个函数返回的对象,需要由函数调用者执行向下转型 (downcast) 。将向下转型的动作移到函数中

Motivation: 

向下转型在Java特别盛行,因为Java没有模板机制,因此如果想从集合之中取出一个对象,就必须进行向下转型。我们应该尽量避免使用向下转型。如果某个函数返回一个值,并且返回的对象类型比函数签名所昭告的更特化,便是在函数用户身上强加了非必要的工作。这种情况下,我们就不应该要求用户承担向下转型的责任,应该尽量为它们提供准确的类型。这些情况,通常会在返回迭代器或集合的函数身上发生。此时就应该观察这个迭代器被用来干什么,然后针对性地提供专用函数。

Mechanics: 

1.找出必须对函数调用结果进行向下转型的地方。

这种情况通常出现在返回一个集合或迭代器的函数中

2.将向下转型动作搬移到该函数中。

针对返回集合的函数,使用Encapsulate Collection

范例

下面的例子中,以Reading表示“书籍”。还有一个名为lastReading()的函数,它从一个用于保存Reading对象的vector中返回其最后一个元素:

Object lastReading(){
    return readings.lastElement();
}

我们应该将这个函数变成:

Reading lastReading(){
    return (Reading)readings.lastElement();
}

当拥有一个集合时,上述那么做就很有意义。如果“保存Reading对象”的集合被放在Site类中,并且客户端代码如下:

Reading lastReading = (Reading)theSite.readings().lastElement();

我们就可以不再把向下转型的工作推给用户,并得以向用户隐藏集合:

Reading lastReading = theSite.lastReading();
class Site {
   ...
   Reading lastReading(){
         return (Reading) readings().lastElement();
   }
}
如果修改函数,将其返回类型改为原返回类型的子类,那就是改变了函数签名,但并不会破坏客户端代码,因为编译器知道它总是可以将一个子类自动向上转型为超类。当然你必须确保这个子类不会破坏超类带来的任何契约。

你可能感兴趣的:(Encapsulate Downcast (封装向下转型))