Подтвердить что ты не робот

Оператор WITH в Java

В VB.NET есть команда WITH, которая позволяет опустить имя объекта и получать доступ только к имеющимся методам и свойствам. Например:

With foo
   .bar()
   .reset(true)
   myVar = .getName()
End With

Есть ли такой синтаксис в Java?

Спасибо!

4b9b3361

Ответ 1

Нет. Лучшее, что вы можете сделать, когда выражение слишком длинное, - назначить его локальной переменной с коротким именем и использовать {...} для создания области:

{
   TypeOfFoo it = foo; // foo could be any lengthy expression
   it.bar();
   it.reset(true);
   myvar = it.getName();
}

Ответ 2

Возможно, самый близкий способ сделать это в Java - это идиома двойной фигурной скобки во время построения.

Foo foo = new Foo() {{
    bar();
    reset(true);
    myVar = getName(); // Note though outer local variables must be final.
}};

В качестве альтернативы методы, возвращающие this, могут быть связаны:

myName =
    foo
        .bar()
        .reset(true)
        .getName();

где методы bar и reset возвращают this.

Однако, желание сделать это имеет тенденцию указывать на то, что объект не имеет достаточно насыщенного поведения. Попробуйте рефакторинг в вызываемый класс. Возможно, существует более одного класса, пытающегося выйти.

Ответ 3

Вы можете довольно близко использовать Java 8 lambdas, с недостатком неспособности изменять локальные переменные.

Объявите этот метод:

static <T> void with(T obj, Consumer<T> c) {
    c.accept(obj);
}

Итак, вы можете использовать:

Window fooBarWindow = new Window(null);

String mcHammer = "Can't Touch This";

with(fooBarWindow, w -> {
     w.setAlwaysOnTop(true);
     w.setBackground(Color.yellow);
     w.setLocation(300, 300);

     w.setTitle(mcHammer); // can read local variables
     //mcHammer = "Stop!"; // won't compile - can't modify local variables
});

Это также возможно использование анонимного класса, но не так чисто.

Ответ 4

Некоторые объекты позволяют вам "цепочки" вызовов метода, которые подходят к синтаксису, который вам нравится. Например, часто класс builder возвращается из методов, поэтому вы можете сделать что-то вроде этого:

MyObject b = new MyBuilder().setFoo(5).setBar(6).setBaz("garply!").build();

Каждый метод set... возвращает this, поэтому вы можете связать следующий вызов.

Ответ 5

Неа. В Java есть политика избежания чего-либо, что может уменьшить многословие.

Хорошо, после написания этого мне просто пришло в голову, что наиболее близким может быть статический импорт, например

package a.b.c.d;
public class Foo {
   public static void bar() {
      ...
   }
}

и теперь вы можете сделать

package d.e.f;
import static a.b.c.d.Foo.*;

bar();

Ответ 6

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

Ответ 7

Как уже было сказано, вы не можете писать код как это в Java.

Как комментарий, если вы боитесь многих копировать/вставлять в случае, когда вам нужно изменить имя переменной, Eclipse позволяет вам автоматически переименовать все ссылки переменной:

Используя ALT + SHIFT + R в имени переменной "foo", вы можете переименовать все одновременно в "myFoo", например:

Foo myFoo = new Foo();
myFoo.bar();
myFoo.reset(true);

Ответ 8

Если у вас есть руки по реализации Foo, вы можете использовать свободно используемую концепцию API.

Допустим, у вас есть это:

public class Foo {
    private String a;
    private String b;
    public void setA(String a) { this.a = a; }
    public void setB(String b) { this.b = b; }
    public String getName() { return this.a + " " + this.b; }
}

Затем вы можете изменить его, чтобы получить это:

public class Foo {
    private String a;
    private String b;
    public Foo setA(String a) { this.a = a; return this; }
    public Foo setB(String b) { this.b = b; return this; }
    public String getName() { return this.a + " " + this.b; }
}

И ваш код вызова может выглядеть следующим образом:

String name = new Foo().setA("foo")
                       .setB("bar")
                       .getName();

Наслаждайтесь!