Правило PMD Создание метода доступа - PullRequest
0 голосов
/ 04 мая 2018

Может кто-нибудь объяснить немного подробнее об этом правиле. Правило: AccessorMethodGeneration Приоритет: 3 Избегать автоматически сгенерированных методов для доступа к закрытым полям и методам внутренних / внешних классов с конкретными примерами как для полей, так и для методов?

1 Ответ

0 голосов
/ 06 мая 2018

В документации PMD содержится сводка правила AccessorMethodGeneration , с моим акцентом:

При доступе к закрытому полю / методу из другого класса, Java компилятор сгенерирует методы доступа с package-private видимость. Это добавляет накладные расходы и рассчитывает на метод dex Android. Этой ситуации можно избежать, изменив видимость поле / метод от private до package-private.

Таким образом, PMD советует вам, что если вы сделаете такие члены и методы пакетными, а не частными, вы избежите накладных расходов, связанных с доступом к ним через методы доступа, сгенерированные компилятором. (Я не являюсь разработчиком Android, поэтому я не могу комментировать проблему «количества методов dex».)

Это пример кода, который PMD предоставляет в отношении частных членов:

public class OuterClass {
    private int counter;
    /* package */ int id;

    public class InnerClass {
        InnerClass() {
            OuterClass.this.counter++; // wrong accessor method will be generated
        }

        public int getOuterClassId() {
            return OuterClass.this.id; // id is package-private, no accessor method needed
        }
    }
}

И вот пример SO , где компилятор будет автоматически генерировать код для доступа к закрытым методам. Обратите внимание на комментарий автора (с моим акцентом):

Компилятор берет внутренние классы и превращает их в верхний уровень классы. Поскольку закрытые методы доступны только для внутреннего класса компилятор должен добавить новые "синтетические" методы, которые имеют пакет уровень доступа , чтобы классы верхнего уровня имели к нему доступ.

Таким образом, PMD помечает код, в котором вы можете улучшить производительность (что, я думаю, обычно незначительно) в некоторых сценариях, изменив доступ к закрытым членам и закрытым методам.

Еще один момент, на который стоит обратить внимание, это то, что некоторые сообщения об ошибках PMD AccessorMethodGeneration не работают должным образом (например, https://github.com/pmd/pmd/issues/274 и https://github.com/pmd/pmd/issues/342). Так что если вы не можете понять, почему PMD помечает ваш код предупреждением AccessorMethodGeneration , проверьте отчеты об ошибках.

...