2016-11-01 4 views
2

Каковы различия и сходства между композицией и внутренними классами? Я пытаюсь изучить принципы Java и попытаться выяснить весь образ. Для меня лучше сделать аналогию и увидеть различия и сходства между понятиями, чтобы использовать их по-разному.Состав против внутренних классов

Определение состава: «Композиция - это техника проектирования для реализации отношений« в классах ». «Java-композиции достигается за счет использования переменных экземпляра, который относится к другим объектам»

Определение внутреннего класса (или класса члена, а не анонимно): «Класс член также определяется в качестве члена класса ограждающей, но не объявляется с помощью статического модификатора. Этот тип внутреннего класса аналогичен экземпляру метода или поля. Экземпляр класса-члена всегда связан с экземпляром охватывающего класса, а код класса-члена имеет доступ ко всем поля и методы»

Так, сталкивая два определения, я вижу некоторые общие черты:

1. Both have HAS-A relationship 
2. Both are strictly dependent on the outer class lifetime 
3. can be declared private 

Отличия:

1. Inner classes uses classes, composition use instances (?!) 
2. In composition no restriction to use the variables of the "outer" class 

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

+2

Вот сравнивая яблоки с апельсинами. У вас должно быть общее основание для сравнения двух вещей. Это похоже на сравнение стиральной машины с поездом на основе того, что у обоих есть двигатели. Вы должны прочитать примеры, демонстрирующие использование этих двух понятий, и посмотреть, могут ли они использоваться для решения проблем в одном домене или нет. – RealSkeptic

+0

Справа. Но на каких основаниях вы пытаетесь их сравнить? Например, вы можете сказать: «Чтобы решить проблему X, я могу использовать это решение или это решение, и два решения аналогичны тем, что они одновременно решают проблему X и, возможно, также в других аспектах, но они различны в аспекте A, B и C ". Но вы начинаете с общей точки зрения: необходимость решить проблему X. – RealSkeptic

+0

@RealSkeptic, могу ли я процитировать вас, если бы мне пришлось ответить на такой вопрос на собеседовании? :) – Alexis

ответ

1

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

  • A - класс, составленный внутренним классом.
  • B - член класса, составленный экземпляром внешнего класса.

Пример:

class Driver { 
} 

class Car { 

    // A 
    class Engine { 
     void start() { 
      if (gasLevel > 0) { 
       ... 
      } 
     } 
    } 

    //B 
    Driver driver; 

    int gasLevel; 

} 

Это говорит:

  • А является полем
  • Б является полем
  • А представляет собой внутренний класс
  • В не является внутренний класс
  • A имеет доступ к внутреннему состоянию автомобиля (gasLevel)
  • B не имеет доступа к внутреннему состоянию автомобиля (gasLevel)
  • Двигатель не существует без экземпляра автомобиля.
  • Драйвер существует без экземпляра автомобиля.

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

+0

спасибо за прекрасное объяснение. Но B не должно быть Ассоциацией (или Агрегацией) в вашем случае? Состав: A состоит из B; B является частью A и, следовательно, не может существовать без A (A владеет B); в вашем случае водитель существует без экземпляра автомобиля. Для меня это просто форма ассоциации (или, может быть, лучше Agreggation): Ассоциация: A использует B, A связана с B определенным образом – Alexis

+0

Я согласен с тем, что мой ответ не был строго точным с термином композиция. Однако ваше первоначальное определение композиции также неточно. Чтобы быть точным, нам нужно называть B агрегацией. Как состав, так и агрегация являются ассоциациями. –

+0

Мы можем назвать композицию A, а B - агрегацией. –

1

Вы правы, что композиция и внутренние классы реализуют схемы «есть-а», но у них много различий.

Композиция, когда ваш класс имеет экземпляр другого класса в качестве переменной экземпляра (иногда называемой полем).

public class A { 
    B otherObject; 
    /* Other fields and methods go here */ 
} 

otherObject в этом случае просто ссылка на экземпляр другого объекта типа В. otherObject может существовать независимо от экземпляра А, а несколько экземпляров могут иметь ссылки на тот же В.

Внутренний класс - это когда определение класса действительно содержится во внешнем классе.

public class C { 
    class D { 
     /* Inner class stuff goes here */ 
    } 
} 

Это используется в основном для логической группировки. В этом случае D напрямую связан с C, тогда как B может быть или не быть логическим дочерним элементом A. Доступ к D вне C становится немного более сложным, но к нему можно получить доступ только через существующий экземпляр C.

так, сталкивая два определения, я вижу некоторые общие черты: ... 3. может быть объявлена ​​частным

Вы правы, что оба могут быть объявлены как private, но смысл частных для этих двух очень разные. private, используемый в композиции, означает, что доступ к этой ссылке ограничен этим классом. Скажите, что в вашем коде выполнения у вас есть объект A типа A. Вы не можете пытаться получить доступ к объектуA.otherObject. otherObject может ссылаться только на тело A. Когда вы объявляете внутренний класс как private, это означает, что использование всего этого класса ограничено телом A. Вы не могли использовать его нигде в любом другом классе.

0

Читать этот блог на композиции делает это, кажется, легко понять .... Composition in JAVA

+0

Всегда добавляйте соответствующие биты из ссылок в ответе, желательно после подведения итогов/перефразирования в соответствии с запросом. – LumberHack