Уместность отражения Java

Это может быть довольно субъективным вопросом, но возможно нет. Мое приложение содержит набор форм, которые отображены пользователю в разное время. Каждая форма является собственным классом. Обычно пользователь нажимает кнопку, которая запускает новую форму.

У меня есть функция удобства, которая создает эти кнопки, Вы называете ее как это:

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?

5
задан jsn 15 May 2010 в 18:45
поделиться

5 ответов

Вы изменили свой buildButton (String, SelectionAdapter) , чтобы пройти курс, над которым вы задумаетесь. Я так понимаю, что сейчас вы создаете новый SelectionAdapter в своем модифицированном методе, а затем размышляете над именем класса, создаете экземпляр и передаете его в showForm (arg) . Я думаю, что это еще один шаг вперед, чем нужно.

Вместо этого вы можете использовать экземпляр любого класса, который требуется вашему showForm (arg) . Ключ будет заключаться в том, чтобы сделать этот аргумент окончательным в вашем списке аргументов для buildButton , и вы сможете использовать его в своем анонимном классе.

0
ответ дан 15 December 2019 в 00:52
поделиться

Одним из альтернативных способов является статический метод в каждой форме, который возвращает кнопку, создающая форму. Но размышления, вероятно, были бы лучше.

0
ответ дан 15 December 2019 в 00:52
поделиться

Проблема не в отражении как таковом. Современные фреймворки постоянно используют отражение. Приятно использовать аннотации для выполнения самых разных задач, что обычно требует отражения.

Однако в вашем случае, почему бы вам просто не сделать:

buildButton( "button text",
        new SelectionAdapterImplementation(new TaskForm(args)) )

если ваш анонимный класс не использует конечные переменные из области видимости, я не вижу причин.

0
ответ дан 15 December 2019 в 00:52
поделиться

Да, обычно отражение не одобряется, но в некоторых случаях оно может быть весьма полезным. Я был бы признателен за чтение кода, который я могу переварить довольно быстро без необходимости проходить через миллион маленьких тонкостей.

3
ответ дан 15 December 2019 в 00:52
поделиться

Если я правильно понимаю, вы хотите выполнить одну операцию (createButton) с разными типами реализаций кнопок (форм) для аргумента. Похоже, вам нужен полиморфизм.

Я предлагаю вам забыть об отражении и создавать эти формы в рамках общего интерфейса. Скажем interface Form {// здесь некоторые методы}

Все ваши формы должны будут реализовывать общий интерфейс, и эти методы необходимы для создания кнопки. Итак, если у вас есть объект Form, вы можете передать его createButton (Form formObject) {...}

ЕСЛИ все, что SelectionAdapter делает, это вызывает метод showForm , вы можете добавить его к общему интерфейсу Form и просто вызовите этот метод для объекта Form. Таким образом, вам не нужно создавать много анонимных классов, а только один и создавать его экземпляр с помощью объекта «Форма».

Все, что вам нужно, это полиморфизм и хорошо подобранные интерфейсы для этих классов.

Если у вас возникла большая проблема с созданием объектов Form (их конструкторы различаются), возможно, вам стоит подумать о создании MyFormBuilder, который обрабатывает только конструирование. У построителя будет метод createInstance () или метод getInstance () , который сделает всю работу.

С моим предложением у вас будет 1 реализация класса SelectionAdapter, вы будете передавать объекты с общим интерфейсом, избегая отражения, передачи аргументов MyClass.class и так далее.

1
ответ дан 15 December 2019 в 00:52
поделиться
Другие вопросы по тегам:

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