Java: разрешено добавлять пользовательский класс в java.awt.image? - PullRequest
1 голос
/ 24 марта 2011

Я почти уверен, что ответ где-то есть, но либо ему не хватает правильных ключевых слов, либо просто нужно немного поспать, но вот оно; ~):

Мне нужно расширить BufferedImage иЕдинственный способ сделать это без MacGyvering всего класса - это оставить новый класс в java.awt.image, потому что он содержит поле, доступное только для пакета, к которому мне нужно получить доступ.Как правило, есть причина отказываться от такой вещи, но если вы проверите источник, вы увидите, что это не так в этом особом случае.

Итак, я проверил его, он компилируется и кажется для запуска.

Но могу ли я на это положиться?Это разрешено?Есть ли что-то, что может помешать мне добавить классы в предопределенные системные пакеты java?Или это просто правильный способ сделать это, и мне никто не сказал?

ОБНОВЛЕНИЕ

Ответы, которые уже были предоставлены, заявили о возможности возникновения правовых проблем (если что-то делают правильно означает нарушение некоторых законов, потому что мое решение по умолчанию часто не интересуется этими законами ;-) и возможностью изменения поведения в суперклассе (очень маловероятно в этом случае).Если бы это все, я бы просто сделал это таким образом ...

ОБНОВЛЕНИЕ2

Отлично!Java - это имя защищенного пакета ... Так что мне действительно нужно MacGyver это ...

UPDATE3

Мне было просто интересно, почему я не могу получить хеш-ключи свойства.Fn getPropertyNames задокументировано так: Возвращает массив имен, распознаваемых getProperty (String) ... давайте посмотрим на исходный код:

public String[] getPropertyNames() {
     return null;
}

Лучший код, который я когда-либо читал ...

Ответы [ 2 ]

1 голос
/ 25 марта 2011

Хорошо, вот как бы я справился с этим:

public class MyBi extends BufferedImage
{
    private final BufferedImage realBufferedImage;

    public MyBi(BufferedImage bi)
    {
        super(0, 0, TYPE_INT_ARGB);
        realBufferedImage = bi;
    }

    // Add methods for managing your extra data

    // For every method in BufferedImage, override it like so:
    public void setData(Raster r)
    {
        realBufferedImage.setData(r);
    }
}

Это утомительно делать вручную, но в NetBeans есть поддержка делегирования. Нажмите Alt Вставьте , выберите Delegate Method..., выберите realBufferedImage в качестве поля на левой панели, отметьте BufferedImage на правой панели и нажмите OK. Мгновенное делегирование.

Это должно работать, потому что, хотя поля BufferedImage находятся в области видимости пакета, ничто другое в пакете не обращается к ним.

0 голосов
/ 24 марта 2011

Вы не «добавляете» к java.awt.Image. В своем собственном пакете вы расширяете класс и делаете, как хотите.

Иногда в проектах с открытым исходным кодом вы можете отправить свой класс обратно в проект и сделать его частью проекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...