Resolves checkstyle errors for delegation dependency-injection dirty-flag double-buffer double-checked-locking double-dispatch (#1068)

* Reduces checkstyle errors in delegation

* Reduces checkstyle errors in dependency-injection

* Reduces checkstyle errors in dirty-flag

* Reduces checkstyle errors in double-buffer

* Reduces checkstyle errors in double-checked-locking

* Reduces checkstyle errors in double-dispatch
This commit is contained in:
Anurag Agarwal
2019-11-10 23:01:20 +05:30
committed by Ilkka Seppälä
parent 01e489c77b
commit f2c91eb836
35 changed files with 154 additions and 215 deletions

View File

@ -23,46 +23,45 @@
package com.iluwatar.doubledispatch;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
/**
*
* When a message with a parameter is sent to an object, the resultant behaviour is defined by the implementation of
* that method in the receiver. Sometimes the behaviour must also be determined by the type of the parameter.
* <p>
* One way to implement this would be to create multiple instanceof-checks for the methods parameter. However, this
* creates a maintenance issue. When new types are added we would also need to change the method's implementation and
* add a new instanceof-check. This violates the single responsibility principle - a class should have only one reason
* to change.
* <p>
* Instead of the instanceof-checks a better way is to make another virtual call on the parameter object. This way new
* functionality can be easily added without the need to modify existing implementation (open-closed principle).
* <p>
* In this example we have hierarchy of objects ({@link GameObject}) that can collide to each other. Each object has its
* own coordinates which are checked against the other objects' coordinates. If there is an overlap, then the objects
* collide utilizing the Double Dispatch pattern.
* When a message with a parameter is sent to an object, the resultant behaviour is defined by the
* implementation of that method in the receiver. Sometimes the behaviour must also be determined by
* the type of the parameter.
*
* <p>One way to implement this would be to create multiple instanceof-checks for the methods
* parameter. However, this creates a maintenance issue. When new types are added we would also need
* to change the method's implementation and add a new instanceof-check. This violates the single
* responsibility principle - a class should have only one reason to change.
*
* <p>Instead of the instanceof-checks a better way is to make another virtual call on the
* parameter object. This way new functionality can be easily added without the need to modify
* existing implementation (open-closed principle).
*
* <p>In this example we have hierarchy of objects ({@link GameObject}) that can collide to each
* other. Each object has its own coordinates which are checked against the other objects'
* coordinates. If there is an overlap, then the objects collide utilizing the Double Dispatch
* pattern.
*/
public class App {
private static final Logger LOGGER = LoggerFactory.getLogger(App.class);
/**
* Program entry point
*
* @param args
* command line args
* Program entry point.
*
* @param args command line args
*/
public static void main(String[] args) {
// initialize game objects and print their status
List<GameObject> objects = List.of(
new FlamingAsteroid(0, 0, 5, 5),
new SpaceStationMir(1, 1, 2, 2),
new Meteoroid(10, 10, 15, 15),
new SpaceStationIss(12, 12, 14, 14));
new FlamingAsteroid(0, 0, 5, 5),
new SpaceStationMir(1, 1, 2, 2),
new Meteoroid(10, 10, 15, 15),
new SpaceStationIss(12, 12, 14, 14));
objects.stream().forEach(o -> LOGGER.info(o.toString()));
LOGGER.info("");

View File

@ -24,9 +24,7 @@
package com.iluwatar.doubledispatch;
/**
*
* Flaming asteroid game object
*
* Flaming asteroid game object.
*/
public class FlamingAsteroid extends Meteoroid {

View File

@ -24,9 +24,7 @@
package com.iluwatar.doubledispatch;
/**
*
* Game objects have coordinates and some other status information.
*
*/
public abstract class GameObject extends Rectangle {

View File

@ -23,15 +23,12 @@
package com.iluwatar.doubledispatch;
import com.iluwatar.doubledispatch.constants.AppConstants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.iluwatar.doubledispatch.constants.AppConstants;
/**
*
* Meteoroid game object
*
* Meteoroid game object.
*/
public class Meteoroid extends GameObject {
@ -48,12 +45,14 @@ public class Meteoroid extends GameObject {
@Override
public void collisionResolve(FlamingAsteroid asteroid) {
LOGGER.info(AppConstants.HITS, asteroid.getClass().getSimpleName(), this.getClass().getSimpleName());
LOGGER.info(AppConstants.HITS, asteroid.getClass().getSimpleName(), this.getClass()
.getSimpleName());
}
@Override
public void collisionResolve(Meteoroid meteoroid) {
LOGGER.info(AppConstants.HITS, meteoroid.getClass().getSimpleName(), this.getClass().getSimpleName());
LOGGER.info(AppConstants.HITS, meteoroid.getClass().getSimpleName(), this.getClass()
.getSimpleName());
}
@Override

View File

@ -24,9 +24,7 @@
package com.iluwatar.doubledispatch;
/**
*
* Rectangle has coordinates and can be checked for overlap against other Rectangles.
*
*/
public class Rectangle {
@ -36,7 +34,7 @@ public class Rectangle {
private int bottom;
/**
* Constructor
* Constructor.
*/
public Rectangle(int left, int top, int right, int bottom) {
this.left = left;

View File

@ -24,9 +24,7 @@
package com.iluwatar.doubledispatch;
/**
*
* Space station ISS game object
*
* Space station ISS game object.
*/
public class SpaceStationIss extends SpaceStationMir {

View File

@ -23,15 +23,12 @@
package com.iluwatar.doubledispatch;
import com.iluwatar.doubledispatch.constants.AppConstants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.iluwatar.doubledispatch.constants.AppConstants;
/**
*
* Space station Mir game object
*
* Space station Mir game object.
*/
public class SpaceStationMir extends GameObject {
@ -48,29 +45,31 @@ public class SpaceStationMir extends GameObject {
@Override
public void collisionResolve(FlamingAsteroid asteroid) {
LOGGER.info(AppConstants.HITS," {} is damaged! {} is set on fire!", asteroid.getClass().getSimpleName(),
this.getClass().getSimpleName(), this.getClass().getSimpleName(), this.getClass().getSimpleName());
LOGGER.info(AppConstants.HITS, " {} is damaged! {} is set on fire!", asteroid.getClass()
.getSimpleName(),
this.getClass().getSimpleName(), this.getClass().getSimpleName(), this.getClass()
.getSimpleName());
setDamaged(true);
setOnFire(true);
}
@Override
public void collisionResolve(Meteoroid meteoroid) {
LOGGER.info(AppConstants.HITS," {} is damaged!", meteoroid.getClass().getSimpleName(),
LOGGER.info(AppConstants.HITS, " {} is damaged!", meteoroid.getClass().getSimpleName(),
this.getClass().getSimpleName(), this.getClass().getSimpleName());
setDamaged(true);
}
@Override
public void collisionResolve(SpaceStationMir mir) {
LOGGER.info(AppConstants.HITS," {} is damaged!", mir.getClass().getSimpleName(),
LOGGER.info(AppConstants.HITS, " {} is damaged!", mir.getClass().getSimpleName(),
this.getClass().getSimpleName(), this.getClass().getSimpleName());
setDamaged(true);
}
@Override
public void collisionResolve(SpaceStationIss iss) {
LOGGER.info(AppConstants.HITS," {} is damaged!", iss.getClass().getSimpleName(),
LOGGER.info(AppConstants.HITS, " {} is damaged!", iss.getClass().getSimpleName(),
this.getClass().getSimpleName(), this.getClass().getSimpleName());
setDamaged(true);
}

View File

@ -24,9 +24,7 @@
package com.iluwatar.doubledispatch.constants;
/**
*
* Constants class to define all constants
*
* Constants class to define all constants.
*/
public class AppConstants {