Преобразуйте бифункцию в функцию в Java - PullRequest
2 голосов
/ 11 июля 2019

Допустим, у меня есть следующее перечисление:

public enum Foo {

  AAA(new A()::doA),
  BBB(new B()::doB),
  CCC(new C()::doC),
  DDD(new D()::doD);

  private Function<String, Number> do;

  Foo(Function<String, Number> do) {
    this.do = do;
  }

  public Function<String, Number> getDo() {
    return do;
  }  
}

Зная, что я должен сохранить метод getDo с точно такой же сигнатурой.

Это прекрасно работает, если я сделаю AAA.getDo().apply("two"), я получу 2 в результате.Но проблема в том, что каждый вызов метода do всегда будет выполняться для одних и тех же экземпляров A, B, C и D. Однако Мне нужно, чтобы A, B, C или D были другим экземпляром вкаждый вызов (поскольку у этих классов есть поля, и я не хочу, чтобы эти поля сохраняли свои значения при каждом вызове метода do).

Я думал о чем-то вроде этого:

AAA(
  A.class,
  A::doA);

Однако в этом случае A::doA больше не является функцией на экземпляре A, а представляет собой функцию BiFunction, в которую мне нужно передать экземпляр A в качестве первого параметра.Но мой метод getDo все еще должен возвращать функцию, и я не вижу способа превратить мою BiFunction и мой класс A в функцию на экземпляре A (мы можем представить что-то вроде: (A::DoA).toFunction(A.class)).

1 Ответ

2 голосов
/ 11 июля 2019

Ссылка на метод new A()::doA привязана к одному объекту A, созданному при оценке new A()::doA для создания экземпляра Function, т. Е. При создании значения enum AAA.new A() выполняется немедленно, и возвращается ссылка на его метод doA(), как если бы вы использовали someInstanceOfA::doA.

Чтобы исправить это, нужно заставить саму функцию вызывать конструктор в логикеэто не запускается сразу:

AAA(s -> new A().doA(s)), 
BBB(s -> new B().doB(s)), 
CCC(s -> new C().doC(s)), 
DDD(s -> new D().doD(s));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...