Я решил FastClasspathScanner решить эту проблему. Он обрабатывает много разных типов задач сканирования классов, имеет простой API, работает со многими различными классами ClassLoaders и classpath, тщательно распараллелен и оптимизирован для высокоскоростного и низкого потребления памяти. Он может даже генерировать визуализацию GraphViz графа классов, показывая, как классы связаны друг с другом.
Для вашего первоначального вопроса о поиске всех классов или интерфейсов в данном пакете вы можете сделать:
List classNames = new FastClasspathScanner("com.mypackage").scan()
.getNamesOfAllClasses();
Существует много возможных вариантов: см. документацию (см. выше) для полной информации.
Да это законно и работает над всеми платформами. Это правильно инициализирует Вашу членскую переменную a к переданному в значении a.
Это рассматривают некоторые более чистые для именования их по-другому хотя, но не все. Я лично на самом деле использую его много:)
Инициализация перечисляет с теми же работами имени переменной, потому что синтаксис объекта инициализации в списке инициализации следующие:
< member> (< value>)
можно проверить то, что я записал выше путем создания простой программы, которая делает это: (Это не скомпилирует)
class A
{
A(int a)
: a(5)//<--- try to initialize a non member variable to 5
{
}
};
, Вы получите ошибку компиляции что-то как: A не имеет поля названным 'a'.
<час>На ноте стороны:
Одна причина, почему Вы не можете хотеть использовать то же имя элемента в качестве названия параметра, состоит в том, что Вы были бы более подвержены следующему:
class A
{
A(int myVarriable)
: myVariable(myVariable)//<--- Bug, there was a typo in the parameter name, myVariable will never be initialized properly
{
}
int myVariable;
};
<час> На ноте (2) стороны:
Одна причина, почему можно хотеть использовать то же имя элемента в качестве названия параметра, состоит в том, что Вы были бы менее подвержены следующему:
class A
{
A(int myVariable_)
{
//<-- do something with _myVariable, oops _myVariable wasn't initialized yet
...
_myVariable = myVariable_;
}
int _myVariable;
};
Это могло также произойти с большими списками инициализации, и Вы используете _myVariable прежде, чем инициализировать его в списке инициализации.
если формальный параметр и участника называют, то же тогда остерегается использования этого указателя внутреннего конструктора для использования членской переменной
class C {
T a;
public:
C(T a): a(a) {
this->a.sort ;//correct
a.sort();//will not affect the actual member variable
}
};
Законный: да, как объяснил Brian, компилятор знает, что имя для ожидания в списке инициализатора еще должно быть участником (или базовый класс), ничто.
Хороший стиль: скорее всего, не - для большого количества программистов (включая Вас, это кажется) результат не очевиден. Используя другое имя для параметра сохранит код законным и сделает его хорошим стилем одновременно.
я предпочел бы писать часть из:
class C {
T a_;
public:
C(T a): a_(a) {}
};
class C {
T a;
public:
C(T value): a(value) {}
};