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:
committed by
Ilkka Seppälä
parent
01e489c77b
commit
f2c91eb836
@ -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("");
|
||||
|
||||
|
@ -24,9 +24,7 @@
|
||||
package com.iluwatar.doubledispatch;
|
||||
|
||||
/**
|
||||
*
|
||||
* Flaming asteroid game object
|
||||
*
|
||||
* Flaming asteroid game object.
|
||||
*/
|
||||
public class FlamingAsteroid extends Meteoroid {
|
||||
|
||||
|
@ -24,9 +24,7 @@
|
||||
package com.iluwatar.doubledispatch;
|
||||
|
||||
/**
|
||||
*
|
||||
* Game objects have coordinates and some other status information.
|
||||
*
|
||||
*/
|
||||
public abstract class GameObject extends Rectangle {
|
||||
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -24,9 +24,7 @@
|
||||
package com.iluwatar.doubledispatch;
|
||||
|
||||
/**
|
||||
*
|
||||
* Space station ISS game object
|
||||
*
|
||||
* Space station ISS game object.
|
||||
*/
|
||||
public class SpaceStationIss extends SpaceStationMir {
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -24,9 +24,7 @@
|
||||
package com.iluwatar.doubledispatch.constants;
|
||||
|
||||
/**
|
||||
*
|
||||
* Constants class to define all constants
|
||||
*
|
||||
* Constants class to define all constants.
|
||||
*/
|
||||
public class AppConstants {
|
||||
|
||||
|
Reference in New Issue
Block a user