弃用最终的超类方法吗?

时间:2018-09-09 07:11:16

标签: java

您将如何指示不赞成使用超类的最终方法?

//Class a out of my control
class A{
    public final void foo(){
     ...
    }
}

class B extends A{
   public void fooAlternative(){...}

   //deprecate foo?
}

背景: 在扩展JavaFX API时,我们面临着几种最终方法,这些方法使我们无法按需进行更改。 有时这是必需的,而我发现的唯一合适的解决方案是创建其他方法。在这种情况下,弃用A提供的方法将使程序员意识到存在另一种替代方法非常有用。

包装对象不是一个可行的选择,因为多态性需要继承。

1 个答案:

答案 0 :(得分:0)

为您提供尤金在评论中所说的更清晰的例子:

import javafx.scene.control.Label;

/**
 * Example as described by @Eugene
 */
public class AWrapper {

    private final Label wrapped = new Label();

    public AWrapper() {

    }

    // Implement only what you **want** to expose

    // Assume setText as "deprecated"

    /**
     *
     * @param text The text
     * @see Label#setText(String)
     */
    @Deprecated
    private void setText(final String text) {
        wrapped.setText(text);
    }

    /**
     * Alternative to {@link AWrapper#setText(String)}.
     *
     * Does some extra work.
     *
     * @param text New text
     */
    private void text(final String text) {
        System.out.println("New Label text: " + text);

        wrapped.setText(text);
    }

}

您将进行合成,而不是进行继承,而将公开所需的任何API(如果有时间的话,还提供完整的原始API)。基本上,这使您可以控制“超级”元素。无法编辑超级类上的元信息,无论如何也不应编辑。