弃用最终的超类方法?

Kil*_*ian 9 java

您如何指出超类的最终方法的弃用?

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

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

   //deprecate foo?
}
Run Code Online (Sandbox Code Playgroud)

背景:在扩展JavaFX API时,我们面临着几种阻止我们随意进行更改的最终方法.有时这是必需的,我找到的唯一合适的解决方案是创建一个额外的方法.在这种情况下,弃用A提供的方法会使程序员意识到存在不同的替代方案.

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

Isf*_*irs 1

为了给你一个更清楚的例子来说明尤金在评论中所说的话:

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

}
Run Code Online (Sandbox Code Playgroud)

您不进行继承,而是进行组合,并且公开您需要的任何 API(如果有时间,则公开完整的原始 API)。这基本上使您可以控制“超级”元素。无法编辑超类的元信息,无论如何您都不应该编辑这些信息。