Я могу использовать идентичные названия параметров конструктора и полей?

Я решил FastClasspathScanner решить эту проблему. Он обрабатывает много разных типов задач сканирования классов, имеет простой API, работает со многими различными классами ClassLoaders и classpath, тщательно распараллелен и оптимизирован для высокоскоростного и низкого потребления памяти. Он может даже генерировать визуализацию GraphViz графа классов, показывая, как классы связаны друг с другом.

Для вашего первоначального вопроса о поиске всех классов или интерфейсов в данном пакете вы можете сделать:

List classNames = new FastClasspathScanner("com.mypackage").scan()
    .getNamesOfAllClasses();

Существует много возможных вариантов: см. документацию (см. выше) для полной информации.

57
задан yesraaj 7 November 2008 в 15:33
поделиться

3 ответа

Да это законно и работает над всеми платформами. Это правильно инициализирует Вашу членскую переменную 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 прежде, чем инициализировать его в списке инициализации.

51
ответ дан Brian R. Bondy 7 November 2019 в 16:08
поделиться

если формальный параметр и участника называют, то же тогда остерегается использования этого указателя внутреннего конструктора для использования членской переменной

class C {
  T a;
public:
  C(T a): a(a) {
this->a.sort ;//correct
a.sort();//will not affect the actual member variable
}
};
9
ответ дан yesraaj 7 November 2019 в 16:08
поделиться

Законный: да, как объяснил Brian, компилятор знает, что имя для ожидания в списке инициализатора еще должно быть участником (или базовый класс), ничто.

Хороший стиль: скорее всего, не - для большого количества программистов (включая Вас, это кажется) результат не очевиден. Используя другое имя для параметра сохранит код законным и сделает его хорошим стилем одновременно.

я предпочел бы писать часть из:

class C {
  T a_;
public:
  C(T a): a_(a) {}
};


class C {
 T a;
 public:
 C(T value): a(value) {}
};
4
ответ дан Suma 7 November 2019 в 16:08
поделиться
Другие вопросы по тегам:

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