Это может быть довольно субъективным вопросом, но возможно нет. Мое приложение содержит набор форм, которые отображены пользователю в разное время. Каждая форма является собственным классом. Обычно пользователь нажимает кнопку, которая запускает новую форму.
У меня есть функция удобства, которая создает эти кнопки, Вы называете ее как это:
buildButton( "button text", new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent e ) {
showForm( new TasksForm( args... ) );
}
} );
Я делаю это десятки времен, и это - действительно громоздкая необходимость сделать SelectionAdapter каждым разом.
Действительно все, в чем я нуждаюсь, чтобы кнопка знала, - то, какого класса инстанцировать, когда это нажато и какие аргументы дать конструктору, таким образом, я создал функцию, которую я вызываю как это вместо этого:
buildButton( "button text", TasksForm.class, args... );
Где args является произвольным списком объектов, которые Вы могли использовать для инстанцирования TasksForm обычно.
Это использует отражение, чтобы получить конструктора от класса, соответствовать списку аргументов и создать экземпляр, когда это должно. Большую часть времени я не должен передавать аргументы конструктору вообще. Оборотная сторона, очевидно, что, если я передаю плохой набор аргументов, он не может обнаружить, что во время компиляции, поэтому если он перестал работать, диалоговое окно отображено во времени выполнения. Но это обычно не перестанет работать, и будет легко отладить, если это сделает.
Я думаю, что это намного более чисто, потому что я происхожу из языков, где использование функции и литералов класса является довольно общим. Но если бы Вы - нормальный программист Java, был бы, видя, что это волнует Вас, или Вы ценили бы не необходимость просканировать огромное количество SelectionAdapters?
Вы изменили свой buildButton (String, SelectionAdapter)
, чтобы пройти курс, над которым вы задумаетесь. Я так понимаю, что сейчас вы создаете новый SelectionAdapter
в своем модифицированном методе, а затем размышляете над именем класса, создаете экземпляр и передаете его в showForm (arg)
. Я думаю, что это еще один шаг вперед, чем нужно.
Вместо этого вы можете использовать экземпляр любого класса, который требуется вашему showForm (arg)
. Ключ будет заключаться в том, чтобы сделать этот аргумент окончательным
в вашем списке аргументов для buildButton
, и вы сможете использовать его в своем анонимном классе.
Одним из альтернативных способов является статический метод в каждой форме, который возвращает кнопку, создающая форму. Но размышления, вероятно, были бы лучше.
Проблема не в отражении как таковом. Современные фреймворки постоянно используют отражение. Приятно использовать аннотации для выполнения самых разных задач, что обычно требует отражения.
Однако в вашем случае, почему бы вам просто не сделать:
buildButton( "button text",
new SelectionAdapterImplementation(new TaskForm(args)) )
если ваш анонимный класс не использует конечные переменные из области видимости, я не вижу причин.
Да, обычно отражение не одобряется, но в некоторых случаях оно может быть весьма полезным. Я был бы признателен за чтение кода, который я могу переварить довольно быстро без необходимости проходить через миллион маленьких тонкостей.
Если я правильно понимаю, вы хотите выполнить одну операцию (createButton) с разными типами реализаций кнопок (форм) для аргумента. Похоже, вам нужен полиморфизм.
Я предлагаю вам забыть об отражении и создавать эти формы в рамках общего интерфейса.
Скажем
interface Form {// здесь некоторые методы}
Все ваши формы должны будут реализовывать общий интерфейс, и эти методы необходимы для создания кнопки. Итак, если у вас есть объект Form, вы можете передать его createButton (Form formObject) {...}
ЕСЛИ все, что SelectionAdapter делает, это вызывает метод showForm
, вы можете добавить его к общему интерфейсу Form
и просто вызовите этот метод для объекта Form. Таким образом, вам не нужно создавать много анонимных классов, а только один и создавать его экземпляр с помощью объекта «Форма».
Все, что вам нужно, это полиморфизм и хорошо подобранные интерфейсы для этих классов.
Если у вас возникла большая проблема с созданием объектов Form (их конструкторы различаются), возможно, вам стоит подумать о создании MyFormBuilder, который обрабатывает только конструирование. У построителя будет метод createInstance ()
или метод getInstance ()
, который сделает всю работу.
С моим предложением у вас будет 1 реализация класса SelectionAdapter, вы будете передавать объекты с общим интерфейсом, избегая отражения, передачи аргументов MyClass.class и так далее.