您如何指出超类的最终方法的弃用?
//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提供的方法会使程序员意识到存在不同的替代方案.
包装对象不是一个可行的选择,因为多态性需要继承.
为了给你一个更清楚的例子来说明尤金在评论中所说的话:
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)。这基本上使您可以控制“超级”元素。无法编辑超类的元信息,无论如何您都不应该编辑这些信息。