Java параметр метода только для аннотированного класса - PullRequest
0 голосов
/ 28 февраля 2020

Надеюсь, я выбрал максимально понятный заголовок. У меня есть классы, аннотированные пользовательской аннотацией

@MyAnnotation
public class MyClass1 {
   //...
}
@MyAnnotation
public class MyClass2 {
   //...
}

У меня есть другой класс, который я хочу обогатить двумя методами с одинаковым именем: один метод, принимающий только аннотированный класс в качестве параметров, и другой метод, который принимает другие классы в качестве параметров

public class MyOtherClass {
   public void myMethod(Object obj) {
       //.....
   }
   public void myMethod (@MyAnnotation Object obj) {
       // this method is applied for only classes annotated with @MyAnnotation
   }
}

Я знаю, что public void myMethod (@MyAnnotation Object obj) - это неправильный способ, которым мы не можем передать аннотацию в качестве параметра. Но я хочу найти правильный способ справиться с этой потребностью.

Ответы [ 2 ]

1 голос
/ 28 февраля 2020

Я не уверен, чего вы пытаетесь достичь. Как вы говорите, вы не можете аннотировать параметр. Вы можете пометить аннотацию как Runtime, но тогда вы можете только проверить с отражением, присутствует ли аннотация или нет. Таким образом, вы можете запустить myMethod с помощью вызова частного метода проверки validateMyAnnotationIsSet(parameter), который проверяет, установлена ​​ли аннотация для данного класса или нет.

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

1 голос
/ 28 февраля 2020

Вы можете иметь один myMethod(Object obj), и внутри него вручную проверить, было ли obj, переданное этому методу, помечено @MyAnnotation (предполагая, что политика хранения должна сохранять его во время выполнения). Затем отправьте вызовы некоторым private void processAnnotated(Object obj) и private void processNotAnnotated(Object obj) в зависимости от результата.

public void myMethod(Object obj) {
  if (obj != null && obj.getClass().isAnnotationPresent(MyAnnotation.class))  {
    processAnnottated(obj);
  } else {
    processNotAnnottated(obj);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...