Затмение: много файлов классов - PullRequest
1 голос
/ 12 марта 2012

Я хотел бы знать, почему я получил как 30 ClassFiles в папке «bin» для моей программы Program.java.

Они названы так:

Testworks$1.class
Testworks$2.class
Testworks$3.class
Testworks$4.class

...

и есть один Testworks.class

Когда я генерирую свой файл Program.jar, все 30 Testworks$X.class копируются внутрь.

Действительно ли они мне нужны и как их исключить?

Ответы [ 4 ]

4 голосов
/ 12 марта 2012

Эти классы являются анонимными внутренними классами. Если вы использовали программирование GUI, вы, возможно, заметили их. Когда вы создаете прослушиватели событий, вы можете сделать что-то вроде: -

Button okBtn = new Button("Ok");
okBtn.addActionListener(new ActionListener(){//this is an anonymous inner class

  public void actionPerformed(ActionEvent ae){
   //your code here
  }
  ...
  ...

});

Этот внутренний класс не имеет явного имени, поэтому компилятор называет его, используя соглашение OuterClass $ x.class. x заменяется номером внутреннего класса (например, 1, 2. и т. д.)

2 голосов
/ 12 марта 2012

Они вам нужны, это анонимные классы, которые есть в вашем коде. Компилятор компилирует их в эту схему именования (Outer$x.class).

1 голос
/ 12 марта 2012

Это зависит от кода, который вы написали. Если у вас есть что-то похожее на приведенное ниже, оно сгенерирует эти $ файлы классов.

List<Person> persons = ...

Collections.sort(persons, new Comparator<Person>() {

    @Override
    public int compareTo(Person p1, Person p2) {
        return p1.getName().compareTo(p2.getName());
    }
});

Если вы по какой-либо причине не хотите видеть файлы $, просто объявите анонимный компаратор в отдельном классе.

public class PersonComparator implements Comparator<Person> {

    @Override
    public int compareTo(Person p1, Person p2) {
        return p1.getName().compareTo(p2.getName());
    }
}

И используйте его как: Collections.sort(persons, new PersonComparator());

0 голосов
/ 12 марта 2012

Внутренние классы компилируются к этому.

...