What are the differences and the similarities between composition and inner classes? I am trying to learn the principles of Java and try to figure out the whole image. For me is better to make analogies and to see the differences and similarities between concepts, in order to use them corectly.
Definition of composition: "Composition is the design technique to implement has-a relationship in classes". "Java composition is achieved by using instance variables that refers to other objects"
Definition of inner class(or member class,not anonymous): "A member class is also defined as a member of an enclosing class, but is not declared with the static modifier. This type of inner class is analogous to an instance method or field. An instance of a member class is always associated with an instance of the enclosing class, and the code of a member class has access to all the fields and methods"
So, by confronting the two definitions, i see some similarities:
1. Both have HAS-A relationship
2. Both are strictly dependent on the outer class lifetime
3. can be declared private
Differences:
1. Inner classes uses classes, composition use instances (?!)
2. In composition no restriction to use the variables of the "outer" class
Please correct me if I am totally wrong, I need to trace better the limits of two concepts.
You're right that composition and inner-classes both implement "has-a" schemes, but they have a lot of differences. Composition is when your class has an instance of another class as an instance variable (sometimes called a field). otherObject in this case is just a reference to an instance of another object of type B.
A class that is defined within another class is called a nested class. An inner class, on the other hand, is a non-static type, a particular specimen of a nested class.
Non-static nested classes are called inner classes. Nested classes that are declared static are called static nested classes. A nested class is a member of its enclosing class. Non-static nested classes (inner classes) have access to other members of the enclosing class, even if they are declared private.
An inner class in Java is defined as a class that is declared inside another class. Inner classes are often used to create helper classes, such as views or adapters that are used by the outer class. Inner classes can also be used to create nested data structures, such as a linked list.
These two concpets are related. To better organize my thoughs let's define A and B:
Example:
class Driver {
}
class Car {
// A
class Engine {
void start() {
if (gasLevel > 0) {
...
}
}
}
//B
Driver driver;
int gasLevel;
}
That said:
To sum up, composition between two distinct classes and composition with an inner class are ways to control the level of coupling and cohesion of your system.
You're right that composition and inner-classes both implement "has-a" schemes, but they have a lot of differences.
Composition is when your class has an instance of another class as an instance variable (sometimes called a field).
public class A {
B otherObject;
/* Other fields and methods go here */
}
otherObject in this case is just a reference to an instance of another object of type B. otherObject can exist independently of your instance of A, and multiple instances of A can have references to the same B.
An inner class is when the class definition is actually contained within the outer class.
public class C {
class D {
/* Inner class stuff goes here */
}
}
This is used mostly for logical grouping. In this scenario, D is directly associated with C, whereas B may or may not be a logical child of A. Access to D outside of C becomes a little more complicated, but it can only be accessed through an existing instance of C.
So, by confronting the two definitions, i see some similarities: ... 3. can be declared private
You're right that both can be declared as private
, but the meaning of private for these two is very different. private
as used in composition means that access to that reference is restricted to that class. Say that in your execution code, you have an objectA of type A. You could NOT attempt to access objectA.otherObject. otherObject can only be referenced from the body of A. When you declare an inner class as private
, it means that use of that entire class is restricted to the body of A. You couldn't use it anywhere in any other class.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With