Java AWT:Font是轻量级的对象吗?

问题描述

| 当我使用Java的AWT时,创建
Font
对象的代价是多少?我应该在可行的情况下缓存“ 0”,还是仅是AWT已在内部缓存的重量级字体的轻量级引用?     

解决方法

如果查看Font(这是OpenJDK)的源代码,则名称,样式,大小的构造函数显然是轻量级的:
public Font(String name,int style,int size) {
    this.name = (name != null) ? name : \"Default\";
    this.style = (style & ~0x03) == 0 ? style : 0;
    this.size = size;
    this.pointSize = size;
}
但是,采用文件和fontformat的构造函数为:
private Font(File fontFile,int fontFormat,boolean isCopy,CreatedFontTracker tracker)
    throws FontFormatException {
    this.createdFont = true;
    /* Font2D instances created by this method track their font file
     * so that when the Font2D is GC\'d it can also remove the file.
     */
    this.font2DHandle =
        FontManager.createFont2D(fontFile,fontFormat,isCopy,tracker).handle;
    this.name = this.font2DHandle.font2D.getFontName(Locale.getDefault());
    this.style = Font.PLAIN;
    this.size = 1;
    this.pointSize = 1f;
}
这显然是重量级的(特别是
FontManager.createFont2D(...)
部分。此构造函数仅由Font.createFont()使用)。 总体而言,如果您使用的是系统中使用的字体,则可以,只需创建它并按名称引用它即可。如果您要提供自己的字体(例如,来自TrueType文件),则最好将其缓存。 (也就是说,IIRC,有一种方法可以简单地将文件加载到AWT的缓存中,因此您可以简单地按名称引用它。) 深入探究源代码,所有功能(例如getFamily(),getFontName(),getNumGlyphs())首先调用getFont2D(),其本质上是:
private Font2D getFont2D() {
    // snip
    if (font2DHandle == null) {
        font2DHandle =
            FontManager.findFont2D(name,style,FontManager.LOGICAL_FALLBACK).handle;
    }
    /* Do not cache the de-referenced font2D. It must be explicitly
     * de-referenced to pick up a valid font in the event that the
     * original one is marked invalid
     */
    return font2DHandle.font2D;
}
因此,这表明每种字体绝对是轻量级的,并且从负责缓存字体的FontManager中提取了必要的信息。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...