Шрифты, как их расширить

Мне было интересно, есть ли способ расширить класс Font таким образом, чтобы я мог вернуть свой собственный класс Font с помощью методов createFont и производныхFont. Я имею в виду что-то вроде этого...

public class MyFont extends Font {

    // Constructor
    public MyFont (...) {
        super(...);
    }

    // createFont method
    public static MyFont createFont (...) {
        // body
    }

    // deriveFont method
    public static MyFont deriveFont (...) {
        // body
    }
}

Я пытался, но не смог получить какой-либо шрифт, и при этом шрифт, который я получил, был шрифтом по умолчанию (я имею в виду «Диалог»).

Причина этого состоит в том, чтобы свести к минимуму влияние возможного изменения в более поздних дистрибутивах 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;
}

person Community    schedule 08.02.2011    source источник
comment
Почему вы хотите это сделать?   -  person Joachim Sauer    schedule 08.02.2011
comment
Что вы подразумеваете под не удалось получить какой-либо шрифт? Пожалуйста, приведите пример того, как вы используете свой класс.   -  person Oliver Charlesworth    schedule 08.02.2011
comment
@Andres: на мой взгляд, вам вообще не следует расширять Font. Я не вижу причин делать это только для того, чтобы добавить простой служебный метод. Просто добавьте этот служебный метод в какой-нибудь свой FontUtil класс и не пытайтесь расширить Font.   -  person Joachim Sauer    schedule 08.02.2011
comment
Причина этого состоит в том, чтобы свести к минимуму влияние возможного изменения в более поздних дистрибутивах Java его виртуальной машины. ‹-- Это не имеет никакого смысла! Каких изменений вы ожидаете, чтобы нарушить обратную совместимость?   -  person Oliver Charlesworth    schedule 08.02.2011
comment
Я имею в виду, что если я сделаю то же самое, что я закодировал выше, извлекая Font, а не MyFont, все пойдет хорошо, проблемы возникают при попытке обернуть класс Font.   -  person    schedule 08.02.2011
comment
Оли, отвечая на твой ДОБРОСОВЕСТНЫЙ вопрос, я не вижу никаких возможных изменений, ты прав, но меня попросили это сделать.   -  person    schedule 08.02.2011


Ответы (1)


0-й. Что делать, если кто-то хочет передать общий шрифт в ваш код, а вам требуется, чтобы аргумент был экземпляром MyFont. Есть ли в этом какой-то практический смысл? Вы пытаетесь использовать наследование для настройки некоторых протоколов жизненного цикла (в данном случае создания объектов), что не очень хорошо вписывается в парадигму объектно-ориентированного программирования Java. Вместо этого используйте заводской метод/прототип.

1-й. createFont() нельзя переопределить, поскольку он статичен. Вы можете предоставить свою собственную версию в своем классе, но использование того же имени метода может запутать других пользователей вашего кода (а позже и вас).

2-й. предоставляя некоторые ярлыки для createFont() и возможные новые версии производныхFont(), вы не избегаете связывания с API, изменения которого вы хотите контролировать, поэтому вам все равно придется перекодировать/перекомпилировать, учитывая изменения реализации Java. Надлежащее избегание зависимостей включает в себя некоторое отражение и имена классов в строковой кодировке с перехватом множества исключений ClassNotFound и других вещей, которые могут произойти при изменении API. Вы не хотите этого. Период.

3-й. просто расслабьтесь, на самом деле этот код достаточно стабилен, и вероятность того, что ваше приложение устареет и будет переписано с нуля, намного выше, чем у тех, кто даже осуждает эти методы, не говоря уже об их удалении. это далеко за концом света в 2012 году (или любой другой более или менее значимой датой, более близкой, чем тепловая смерть Вселенной).

В завершение просто добавьте пару легко различимых статических сочетаний клавиш: MyFonts.create(), связанный с Font.creatFont(), и еще один MyFonts.derive(Font font, otherargs), связанный с font.derive(otherArgs). Будь проще, чувак, и запечатай конструктор MyFonts(), чтобы указать, что это фабричный/служебный класс.

person Anton Kraievyi    schedule 27.02.2011