Java2D: Всегда ли безопасно использовать графику в Graphics2D

#java #java-2d

Вопрос:

Предполагая, что мы всегда используем JVM Sun (скажем, 1.5 ), всегда ли безопасно ссылаться на графику Graphics2D?

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

Ответ №1:

Согласно обсуждению здесь, всегда безопасно бросать от Graphics до Graphics2D . Однако я не могу быстро найти официальное заявление Sun по этому поводу.

Причина, по которой допустимо преобразование из графики в Graphics2D, заключается в том, что Sun сказала, что все графические объекты, возвращаемые API в Java 1.2 или выше, будут подклассом Graphics2D.

Еще один намек здесь с тем же выводом.

Графический объект всегда может быть отлит Graphics2D g2d = (Graphics2D)g;

Комментарии:

1. Спасибо за рекомендации. Я собираюсь принять это, даже если в нем прямо не упоминается источник Солнца, потому что я думаю, что он достаточно близок.

2. Насколько я помню, все документы Sun всегда показывают актерский состав для материалов Graphics2D, поэтому я предполагаю, что это безопасно. Если вы действительно хотите быть педантичным, вы могли бы использовать блок try/catch, но я думаю, что если у вас есть классы Graphics2D (достаточно новые JVM/библиотеки), вы в безопасности.

3. Первая связь мертва

Ответ №2:

В книге «Грязный богатый клиент» Чета Хааза и Ромена Гая говорится, что Свинг почти всегда использует Graphics2D объект. Исключениями из этого являются печать и DebugGraphics объект Swing. Так что до тех пор, пока ни одна из этих ситуаций не применима к вашему коду, его можно безопасно использовать Graphics2D .
Оба автора работали в Sun, поэтому я бы предположил, что они знают, о чем говорят.

Ответ №3:

В следе 2D — графики говорится:

Чтобы использовать функции Java 2D API в приложении, приведите графический объект, переданный в метод визуализации компонента, к объекту Graphics2D. Например:

 public void paint (Graphics g) {
    Graphics2D g2 = (Graphics2D) g;
    ...
}
 

Это самый «официальный» источник, который я смог найти. Исходя прямо из учебных пособий Sun по Java, я бы сказал, что это официально санкционированный способ сделать это. Однако я бы не возражал, если бы в JavaDocs это было прописано…