2014-11-28 11 views
1

у меня есть свой класс DTO что:Как добавить интерфейс к классу в java?

public class EmailResponse { 

    // Make public to avoid getters and setters 
    public Email email; 
    public RequestData reqData;  

    public EmailResponse() { 
     super(); 
    } 

} 

и я хочу реализовать ему этот интерфейс:

public interface IAssertionErrorDo { 
    public void onErrorDo(); 
} 

, но я хочу сделать это во время выполнения, я не хочу трогать «EmailResponse», потому что было бы нехорошо сделать это, реализуя этот интерфейс, потому что они не принадлежат к одному и тому же слою, я имею в виду, что EmailResponse будет принадлежать уровню обслуживания, а IAssertionError будет принадлежать тестовому уровню. Я использую TestNG.

Вы знаете, как я мог это сделать? С уважением

EDIT: Моя реализация заключается в следующем:

EmailResponse emailResponse = emailService.getUserEmail(userId); 

И причина я хочу сделать это "инъекции", потому что у меня есть

public class LoggingAssert 
    extends Assertion { 

    private static final Logger LOGGER = LoggerFactory.getLogger(LoggingAssert.class); 
    private IAssertionErrorDo dataE; 
    @Override 
    public void onAssertFailure(IAssert a, AssertionError ex) { 
     LOGGER.info("[ERROR] " + a.getMessage()); 
     if (this.dataE != null) { 
      this.dataE.onErrorDo(); 
     } 
    } 

    public LoggingAssert setOnErrorDo(IAssertionErrorDo object) { 
     this.object = object; 
     return this; 
    } 
} 

loggingAssert.setOnErrorDo(emailResponse).assertNotNull(emailResponse.getEmail().getId(), 
      "Checking created email doesn't exists"); 

Так я хотите, чтобы assert не выполнял метод onErrorDo() из emailResponse

ответ

1

реализации вызовов интерфейсов можно назвать более 1 интерфейс, если вы хотите, добавив запятые для разделения их ..

для вызова методов интерфейса вы просто просто использовать методу имя.

так:

public class MyEmailResponse implements IAssertionErrorDo 
{ 
    public void onErrorDo() {//define it's behavior} 
} 

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

MyClass mc = new MyClass();

, если он находится в другом пакете, то

myPackage.MyClass mc = new myPackage.MyClass(); тогда вы называете метод из этого класса, используя объект, созданный, который в этом случае тс .. так:

mc.MyMethod();

, если вы хотите, чтобы вернуть переменную, то вы будете необходимо добавить оператор return в этот метод с переменной, которую вы хотите вернуть.

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

+0

И как это могло быть реализовано для этого? Я отредактировал сообщение с тем, как у меня действительно есть его. Спасибо за вашу помощь – jscherman

+0

Я не могу понять цель там .. но вы пытаетесь сделать обработчик исключений? – bakriawad

+0

Я отредактировал еще раз: P Извините за это. Я хочу сделать метод onErrorDo(), если assert failed. – jscherman

2

Вы могли бы сделать

public class MyEmailResponse extends EmailResponse implements IAssertionErrorDo { 
... 
} 
+0

OP явно не хочет просто реализовывать интерфейс из-за того, что он предназначен только для тестов. – cello

+0

Это был вариант. Я думал об этом на тестовом уровне. Но для одной стороны у меня будет один класс для каждого DTO, который у меня есть (у меня больше, чем просто EmailResponse). Помимо этого, мой метод уровня обслуживания возвращает мне EmailResponse, как я могу преобразовать этот EmailResponse в MyEmailResponse? Спасибо за вашу помощь – jscherman

Смежные вопросы