Как вложить методы в Java, чтобы заставить пользователя использовать вложенное имя? - PullRequest
0 голосов
/ 02 июля 2019

Я пишу библиотеку, для большей читабельности я хочу заставить пользователя использовать вложенные методы для вызова правильных функций.

Например, мой класс выглядит так:

public class Foo{
public void methodA(){}
public void methodB(){}
public void methodC(){}
}

Что я ожидаю от пользователя:

Foo foo = new Foo();
foo.methodA.methodB();
foo.methodA.methodC();

для вызова метода B & C посредством вызова метода A в качестве префикса

Ответы [ 3 ]

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

После прочтения вашего вопроса я думаю, что вы спрашиваете о шаблоне Builder Design, в котором все возвращаемые методы имеют один и тот же объект класса, и вы можете создать иерархию вызовов следующим образом.

obj.aMethod().bMethod().cMethod();

в вашем примере просто сделайте так:

public class Foo{
 private static final Foo instance = new Foo();
 private Foo(){}

 public static Foo getInstance(){
    return instance;
 }

 public Foo methodA(){
  //Do stuff 
  return getInstance();
 }
 public Foo methodB(){}
 public Foo methodC(){}
}

Теперь вы можете звонить как objfoo.getInstance().methodA().methodB();

Надеюсь, это поможет вам. Чтобы узнать больше об этом шаблоне

0 голосов
/ 02 июля 2019

Чтобы заставить пользователя использовать methodA для доступа к methodB, вы можете использовать внутренний класс. В methodB вы можете получить доступ к Foo-Object с помощью Foo.this.

public class Foo{
   public Bar methodA()
   {
       // ...
       return new Bar();
   }

   public class Bar {

      private Bar() {}; // only methodA can create a Bar object

      public void methodB(){}
      public void methodC(){}

  } 
}
0 голосов
/ 02 июля 2019

Это называется методом цепочки.Вам нужно будет установить тип возвращаемого значения всех методов так же, как класс.

public class Foo{ 
public Foo methodA()
public Foo methodB() 
public Foo methodC() 
}

Теперь клиент может просто позвонить:

foo.methodA().methodB(), etc. 

У вас может быть один «терминальный метод», т.е. тот, который не возвращает значение.Например,

public void methodD();

Этот метод будет вызываться последним.

foo.methodA().methodB().methodC().method();

Эта строка сама по себе будет действительной, поскольку тип возвращаемого значения void.

Пожалуйста, посмотрите на метод цепочки / построитель шаблонов видео на YouTube, это будет понятно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...