您将如何指示不赞成使用超类的最终方法?
//Class a out of my control
class A{
public final void foo(){
...
}
}
class B extends A{
public void fooAlternative(){...}
//deprecate foo?
}
背景: 在扩展JavaFX API时,我们面临着几种最终方法,这些方法使我们无法按需进行更改。 有时这是必需的,而我发现的唯一合适的解决方案是创建其他方法。在这种情况下,弃用A提供的方法将使程序员意识到存在另一种替代方法非常有用。
包装对象不是一个可行的选择,因为多态性需要继承。
答案 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)。基本上,这使您可以控制“超级”元素。无法编辑超级类上的元信息,无论如何也不应编辑。