Подтвердить что ты не робот

Анонимное определение класса на основе интерфейса... может быть?

Я видел этот фрагмент Java в книге Spring в действии, но я не знаком с конструкцией языка.

new RowMapper() {
  public Object mapRow() throws SQLException, DataAccessException {
    Motorist motorist = new Motorist();
    motorist.setId(rs.getInt(1));
    motorist.setEmail(rs.getString(2));
    motorist.setPassword(rs.getString(3));
    motorist.setFirstName(rs.getString(4));
    motorist.setLastName(rs.getString(5));
    return motorist;
  }
}

Согласно Spring документации, RowMapper - это интерфейс. Он выглядит как определение анонимного класса, основанное на интерфейсе RowMapper. Ключевое слово new немного запутанно, заставив меня задаться вопросом, создает ли это также один экземпляр анонимного класса. Я бы предположил, да, потому что если класс не имеет имени, как вы когда-нибудь создадите экземпляр после строки, которая его определяет?

Кто-нибудь может подтвердить мои предположения, что:

  • это анонимное определение класса, основанное на интерфейсе RowMapper, и
  • он создает один экземпляр этого класса?
4b9b3361

Ответ 1

Это анонимное определение класса на основе интерфейса RowMapper

Именно это и есть.

Создает один экземпляр этого класса?

Угу. Это правильно.

Ответ 2

Этот код реализует интерфейс анонимным способом.

Синтаксис будет похож на:

Runnable runnable = new Runnable() {
    public void run() {
    }
};

Обратите внимание на точку с запятой в конце объявления. Здесь запущенный объект, хотя и содержит ссылку на интерфейс Runnable, фактически содержит реализованный объект. Этот полиморфизм времени выполнения для вас!

Ответ 3

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

Ответ 4

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

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

Это определение анонимного класса на основе интерфейса RowMapper?

Да. Как вы видите, функция mapRow() написана. И если вы отлаживаете код, который вы видите, это не класс экземпляра интерфейса, а класс, расширяющий интерфейс. В случае абстрактного класса или просто класса он будет таким же - расширенным. Поэтому, если класс final, вы не можете написать для него анонимный класс.

Создает ли он один экземпляр этого класса?

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

Ответ 5

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

Ответ 6

Объявление анонимного класса и в нижнем примере оно создает два экземпляра.

public class Multithread {
    void test(){
    new Runnable() {
        @Override
        public void run() {

            System.out.println("1");
        }
     }.run();
     new Runnable() {
         @Override
         public void run() {

             System.out.println("11");
         }
      }.run();}



    public static void main(String[] args) {
        new Multithread().test();
      }



}