関数型言語とは異なり、Java のようなオブジェクト指向言語では、関数を渡すのではなく、メソッドを呼び出すことができるオブジェクトを渡します。Boolean メソッドを Car クラスから見えるようにする方法はいくつかあります。canAddCar
との混同を避けるために、メソッドを呼び出しますCar#addCar
。
最も簡単なのは、 Car クラス自体でメソッドを定義できる場合です。
public class Car {
public boolean canAddCar(CarReg carReg, Car car) {
// logic for checking if you can add the car
}
public boolean addCar(CarReg carReg, Car car) {
if (canAddCar(carReg, car)) {
// logic for adding the car goes here
return true;
} else {
// anything special if you can't add the car?
return false;
}
}
}
次に簡単なのは、次のように、渡すオブジェクトのクラスでメソッドを定義できる場合です。CarReg
車を追加できるかどうかを確認するのが carReg の責任である場合、これは理にかなっています。命名に基づいて、おそらく carReg も車の追加を担当する必要があると思いますが、ここでは示していません。
public class CarReg {
public boolean canAddCar(Car car) {
// logic for testing if you can add the car, for example:
return (car.getOwner().toString().equals("pete"));
}
}
public class Car {
public boolean addCar(CarReg carReg, Car car) {
if (carReg.canAddCar(car)) {
// ...
} else {
// ...
}
}
}
次に、チェックを担当できる別のオブジェクトをクラスに渡すことができます。これは、メソッドの別のオブジェクト、またはクラスaddCar
のプロパティにすることができます。Car
この例では後者を示しています (前の例は基本的に前者であるため)。
// might as well use an interface if you'll have multiple methods of checking
public interface CarChecker {
boolean canAddCar(CarReg carReg, Car car);
}
// specific implementation of the CarChecker interface
// you can instantiate this and pass it into the Car class via a setter
public class MyCarChecker implements CarChecker {
public boolean canAddCar(CarReg carReg, Car car) {
// checking logic goes here
}
}
public class Car {
private CarChecker carChecker;
// you'll have to implent getCarChecker and setCarChecker
// (or let your IDE generate the getters and setters)
// assuming you'll call setCarChecker somewhere (or have it wired up via IoC)
public boolean addCar(CarReg carReg, Car car) {
if (carChecker.canAddCar(carReg, car)) {
// ...
} else {
// ...
}
}
}
他にもいくつかの方法 (匿名クラス、シングルトン クラス、静的メソッド) がありますが、これらが最も一般的であり、開始する必要があります。