Разница между абстрактным и общим кодом - PullRequest
3 голосов
/ 03 августа 2009

В чем разница между словом «абстрактный» и «общий» код в случае Java? Оба означают одно и то же?

Ответы [ 4 ]

6 голосов
/ 03 августа 2009

Abstract и Generics - это совершенно разные вещи в синтаксисе и семантике Java.

abstract - это ключевое слово, указывающее, что класс не содержит полную реализацию, поэтому не может быть создан.

Пример:

abstract class MyClass {
  public abstract void myMethod();
}

MyClass содержит определение метода 'public abstract void myMethod ()', но не определяет реализацию - реализация должна обеспечиваться подклассом, обычно называемым конкретным подклассом, поэтому абстрактный класс определяет интерфейс, возможно, с некоторыми деталями реализации.

Использование шаблонов указывает на то, что аспекты класса могут быть параметризованы. Я считаю, что самый простой для понимания пример в API коллекций Java.

Например, List<String> можно прочитать как «Список объектов типа String». List<Integer> - это тот же интерфейс List, но принимает только объекты типа Integer.

В API коллекций он обеспечивает безопасность типов для коллекций, которым в противном случае требуется шаблон для проверки типов и соответствующего приведения.

5 голосов
/ 03 августа 2009

Аннотация - мыслить отдельно от конкретных реальностей, конкретных объектов, или фактические случаи.

В Java вы найдете слово abstract в определениях классов и методов. Это означает, что экземпляр класса не может быть создан (я могу использоваться только как суперкласс) или что метод должен быть переопределен подклассом. Примером этого является класс Animal, Animal слишком неоднозначен, чтобы создавать экземпляр из него, однако Animals имеют общие атрибуты / функциональные возможности, которые должны быть определены в классе Animal.

public abstract class Animal{
   protected int calories;

   public void feed(int calories){
      weight += calories;
   }

   public abstract void move(); // All animals move, but all do not move the same way
                                // So, put the move implementation in the sub-class
}

public class Cow extends Animal{
    public void move(){
       // Some code to make the cow move ...
    }
}

public class Application{
   public static void main(String [] args){
      //Animal animal = new Animal()   <- this is not allowed
       Animal cow = new Cow() // This is ok.
   }
}

Общий - из, применимый или относящийся ко всем членам род, класс, группа или род; общий.

Термин Generic, или Generics, используется в Java, когда явно объявляет, какой тип объектов будет содержаться в каком-либо объекте-контейнере. Возьмем, к примеру, ArrayList, мы можем поместить любой объект в ArrayList, который захотим, но это может легко привести к ошибкам (вы можете случайно вставить String в ваш ArrayList, который заполнен целыми числами). Обобщения были созданы в Java, так что мы можем явно указать компилятору, что нам нужны только целые числа в нашем ArrayList (с обобщениями компилятор выдаст ошибку, когда вы попытаетесь вставить строку в ваш целочисленный ArrayList).

public class Application{
   public static void main(String [] args){
      ArrayList noGenerics = new ArrayList();
      ArrayList<Integer> generics = new ArrayList<Integer>();

      nogenerics.add(1);
      nogenerics.add("Hello"); // not what we want, but no error is thrown.

      generics.add(1);
      generics.add("Hello"); // error thrown in this case

      int total;
      for(int num : nogenerics)  
          total += num;
      // We will get a run time error in the for loop when we come to the
      // String, this run time error is avoided with generics.
   }
}
3 голосов
/ 03 августа 2009

Короткий, понятный ответ:

  • Абстрактный код выражает идею, но не как заставить ее работать

  • Общий код работает с несколькими типами объектов и знает, какой тип вы ему дали


Более длинный, но не текстовый:

Аннотация указывает интерфейс без полной реализации

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

Пример: вы можете написать абстрактный класс Store с использованием абстрактных методов storeValue и getValue. Затем вы расширяете его различными реализациями для хранения базы данных, дискового хранилища, сетевого хранилища и памяти. Все используют одни и те же методы, за исключением методов storeValue и getValue. Вы можете использовать их взаимозаменяемо.

Общий код включает информацию о типе и может работать с несколькими типами:

  • Обобщения не позволяют вам делать то, что вы не могли делать с ванильными объектными входами / выходами и множеством проверок instanceof и приведением объектов
  • Хотя их легче читать!
  • Общий код определяет, с какими объектами он работает, и позволяет работать с группами одного и того же объекта
  • Общий код позволяет вам указать алгоритм, не зная, над чем он работает - при вызове алгоритма он может выводить тот же тип, что и ввод, независимо от того, какой ввод может быть
  • Вам не нужно приводить в / из ванильных объектов (и проверять тип объекта), если вы используете Generics для работы с различными типами объектов
  • Самым распространенным местом для генериков является работа с коллекциями - вы можете хранить коллекцию чего-либо, не зная, что именно это такое
  • Обобщения могут быть очень сложными

Пример: Вы определяете метод «add», который добавляет объекты типа String (или аналогичные) в конец, или суммирует объекты Number или добавляет элемент одного типа в коллекцию, содержащую этот тип

2 голосов
/ 03 августа 2009

Аннотация используется для определения чего-то, что требует дополнительного определения функциональности, прежде чем оно будет считаться «полным» (или конкретным в терминах Java-сертификации-теста). Универсальный означает, что это класс, который может обрабатывать широкий спектр типов данных, которые вы определяете при создании экземпляра класса.

...