class A {final B b;A(B b){ this.b = b;}}class B {final A a;B(){ this.a = new A(this);}}+---------+ +---------+| A |<-----| B | | | | | | |----->| |+---------+ +---------+
class A {final B b;A(B b){ this.b = b;}}class B {final A a;B(A a){ this.a = a;}}
+---------+ +---------+| A |<-----| B | | | | | +-+ | | | | +->|C| || |------+---->| | || | | +-+ |+---------+ +---------+
+---------++---------+ | B || A |<-------------| | | | | | | | +---+ | | | |--->| C |<----| | | | +---+ +---------+ +---------+ class C { C(){ } } class A { final C c; A(C c){ this.c = c; } } class B { final A a; final C c; B(A a, C c){ this.a = a; this.c = c; } }
public interface PlanetaryDeathRay { public void aim(double xPosition, double yPosition); public boolean fire(); /* call this if she says the rebel base is on Dantooine */}public class BlueLaserPlanetaryDeathRay implements PlanetaryDeathRay { /* implementation here */ }public class GreenLaserPlanetaryDeathRay implements PlanetaryDeathRay { /* implementation here */ }
public abstract class PlanetaryDeathRayTestCase extends TestCase { protected PlanetaryDeathRay deathRay; @Override protected void setUp() { deathRay = createDeathRay(); } @Override protected void tearDown() { deathRay = null; } protected abstract PlanetaryDeathRay createDeathRay(); /* create the PlanetaryDeathRay to test */ public void testAim() { /* write implementation-independent tests here against deathRay.aim() */ } public void testFire() { /* write implementation-independent tests here against deathRay.fire() */ }}
public class BlueLaserPlanetaryDeathRayTest extends PlanetaryDeathRayTestCase { protected PlanetaryDeathRay createDeathRay() { return new BlueLaserPlanetaryDeathRay(); }}
if
switch
instanceof
#ifdef PROD
class Mechanic { Engine engine; Mechanic(Context context) { this.engine = context.getEngine(); } }
class Mechanic { Engine engine; Mechanic(Engine engine) { this.engine = engine; } }
class Monitor { SparkPlug sparkPlug; Monitor(Context context) { this.sparkPlug = context. getCar().getEngine(). getPiston().getSparkPlug(); } }