Значение добавленных значков доллара в именах классов, отображаемых в Android-профайлере «Куча дампа» [дубликат]

  var x = 0;  var y = 0;  document.addEventListener ('mousemove', onMouseMove, false) function onMouseMove (e) {x = e.clientX;  y = e.clientY;  } function getMouseX () {return x;  } function getMouseY () {return y;  }  
61
задан Óscar López 10 July 2012 в 23:14
поделиться

4 ответа

Внутренние классы, если они есть в вашем классе, будут скомпилированы, а файл класса будет ClassName$InnerClassName. В случае анонимных внутренних классов он будет отображаться как числа. Размер класса (код Java) не приводит к генерации нескольких классов.

Например. с учетом этой части кода:

public class TestInnerOuterClass {
    class TestInnerChild{

    }

    Serializable annoymousTest = new Serializable() {
    };
}

Классы, которые будут сгенерированы, будут:

  1. TestInnerOuterClass.class
  2. TestInnerOuterClass$TestInnerChild.class
  3. TestInnerOuterCasss$1.class

Обновление:

Использование анонимного класса не считается плохой практикой, оно просто зависит от использования.

] Проверьте обсуждение на SO

84
ответ дан Eugene S 15 August 2018 в 14:36
поделиться
  • 1
    Хорошо, так плохо иметь анонимный класс? Я не совсем понимаю, как это работает. Если я создаю новую переменную экземпляра класса в классе, это анонимный класс? – Frizinator 9 July 2012 в 04:48
  • 2
    Нет, неплохо иметь анонимный класс, это зависит от использования. Обновлено мое сообщение – mprabhat 9 July 2012 в 04:49
  • 3
    Перечисления, содержащие тело класса, автоматически генерируют анонимный внутренний класс, который расширяет класс enum и, таким образом, генерирует еще один файл класса с $ в нем. – dlaidlaw 7 July 2015 в 15:22
  • 4
    Также, если внутренний класс является приватным, создается дополнительный класс с именем OuterClass $ 1.class – SandeepGodara 5 May 2016 в 08:44
  • 5
    @mprabhat: есть ли какой-либо механизм в студии Android для просмотра иерархии или списка этих классов? – user1090751 5 March 2018 в 11:43

Это потому, что у вас есть анонимные классы в этом более крупном классе. Они компилируются с использованием этого соглашения об именах.

См. Анонимный класс Conundrum

13
ответ дан Community 15 August 2018 в 14:36
поделиться

В дополнение к вышеуказанным случаям, представленным @mprabhat, другие случаи могут быть:

  1. , если в классе содержится переменная enum, для этого также будет создан отдельный класс. Имя сгенерированного класса должно быть ClassName $ Name_of_enum.
  2. Если ваш класс X наследует, то есть расширяет другой класс Y, тогда будет класс .class, сгенерированный с именем ClassName $ 1.class или ClassName $ 1 $ 1.class
  3. Если ваш класс X реализует интерфейс Y, тогда будет класс .class, сгенерированный с именем ClassName $ 1.class или ClassName $ 1 $ 1.class.

Эти случаи являются выводами моей проверки на файлы .class в банке.

6
ответ дан Hoysala 15 August 2018 в 14:36
поделиться
  • 1
    У меня есть класс, который не отвечает ни одному из этих критериев, а class.getName () все еще не так - для Group.java он возвращает Group _ $$ _ jvst248_20. Я понятия не имею, что происходит. Определенно нет перечислений, распространяется или реализуется. – Amalgovinus 20 April 2016 в 20:12

Чтобы ответить на ваш комментарий, анонимные классы плохо. Их больше всего нет. Рассмотрим это, чтобы назначить прослушиватель действий JButton:

JButton button = new JButton(...);
button.addActionListener(new ActionListener() { ... });

или это сделать нечувствительный к регистру сортировку с помощью свойства «name»

Collections.sort( array, new Comparator<Foo>() {
    public int compare(Foo f1, Foo f2) {
        return f1.getName().toLowerCase().compareTo(f2.getName().toLowerCase());
    }
});

. Вы также увидите много Runnable и Callable сделано как анонимные классы.

0
ответ дан Matt 15 August 2018 в 14:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: