Создание Drools с полем члена объекта в предложении when - PullRequest
0 голосов
/ 26 февраля 2020

Я новичок в слюнях, поэтому, пожалуйста, потерпите меня. У меня есть следующее правило:

rule "01: Car can not be black"
  when 
    Car(color == "black")
  then 
    System.out.println("Car can not be black");
end

Будет ли это работать при этом (где Door - это объект-объект, имеющий цвет в качестве переменной-члена):

rule "02: Car's door can not be black"
  when 
    Car(door.color == "black")
  then 
    System.out.println("Car's door can not be black");
end

Если это невозможно, какой шаблон использовать, чтобы соответствовать решению?

1 Ответ

1 голос
/ 28 февраля 2020

Оба эти правила действительны, если у вашего класса есть подходящие имена getter.

Первое правило будет работать для класса Car, который либо имеет свойство publi c color или он имеет метод publi c getColor:

public class Car {
  public String color;
}
// or:
public class Car {
  private String color;
  public String getColor() {
    return this.color;
  }
}

Аналогично, второе правило будет работать, если ваш класс Car имеет свойство publi c Door или publi c getDoor метод, и Дверь, аналогично, либо публикует c Color, либо getColor().

Другой способ написать второе правило, которое проверяет, что дверь не черная, будет выглядеть так: this:

rule "03: Another way to make sure the car's door cannot be black"
when
  Car( $door: door != null ) // gets the Door from the car
  Door( color == "black" ) from $door // checks if the Door is black
then
  System.out.println("Car's door cannot be black");
end

Этот способ полезен, если вам нужно проверить другие свойства той же двери. Например, предположим, что в вашем автомобиле несколько дверей, а в модели автомобиля - метод List<Door> getDoors();. Чтобы проверить, есть ли какая-нибудь черная и круглая дверь, вы можете сделать:

rule "04: A car cannot have any black and round doors"
when
  Car( $doors: doors != null ) // get all of the Doors for the car

  // finds that any one door is both black and round:
  exists(Door( color == "black",
               shape == "round" ) from $doors) 
then
  //...
end

Здесь я использовал exists, потому что на самом деле мне не нужно ничего делать с черной и круглой дверью, я просто хочу убедиться, что он существует.

...