我想知道是否有一种方法可以通过createFont和deriveFont方法返回我自己的Font类来扩展Font类。我的意思是这样的......
public class MyFont extends Font {
// Constructor
public MyFont (...) {
super(...);
}
// createFont method
public static MyFont createFont (...) {
// body
}
// deriveFont method
public static MyFont deriveFont (...) {
// body
}
}
我已经尝试但我无法检索任何字体,当我这样做时,我得到的字体是默认字体(我的意思是“对话框”)。
这样做的原因是最小化其VM的后续Java分发中的最终更改所产生的影响。
这是上面召唤的代码:
MyFont onePoint=MyFont.createFont(MyFont.TRUETYPE_FONT,fontStream, size);
然后在MyFont,我编码:
public static MyFont createFont (int i, InputStream io, int size) throws FontFormatException, IOException {
Font font = Font.createFont(i, io);
MyFont kfont = new
MyFont(font.getName(),font.getStyle(),font.getSize());
return kfont;
}
答案 0 :(得分:0)
第0。如果有人想将通用Font传递给您的代码,并且您需要将参数作为MyFont的实例,该怎么办?它有任何实际意义吗?您尝试使用继承来调整某些生命周期协议(在这种情况下创建对象),这些协议不适合Java OO范例。改为使用工厂方法/原型。
第一。 createFont()不可覆盖,因为它是静态的。您可以在班级中提供自己的版本,但使用相同的方法名称可能会使您的代码的其他用户感到困惑(稍后,您也会感到困惑)。
第二。虽然为createFont()和可能的新版本的deriveFont()提供了一些快捷方式,但是你不能避免链接你想要控制其变化的API,所以在java实现改变的情况下你无论如何都必须重新编码/重新编译。适当的依赖性避免涉及一些反射和字符串编码的类名,其中包含大量的ClassNotFound异常以及其他可能在API更改中发生的异常。你不希望这样。周期。
第三。只是放松一下,真的,这段代码非常稳定,你的应用程序可能已经过时并且从头开始重写的可能性远远超过任何人甚至弃用这些方法,单独删除它们。这远远超出了2012年的世界末日(或任何其他或多或少相关的日期,而不是宇宙的热死亡)。
要包装它,只需添加几个容易区分的静态快捷方式:MyFonts.create()链接到Font.creatFont(),另一个MyFonts.derive(Font字体,otherargs)链接到font.derive(otherArgs) 。保持简单,粗鲁,并密封MyFonts()构造函数,以表明这是一个工厂/实用程序类。