В VB.NET есть команда WITH, которая позволяет опустить имя объекта и получать доступ только к имеющимся методам и свойствам. Например:
With foo
.bar()
.reset(true)
myVar = .getName()
End With
Есть ли такой синтаксис в Java?
Спасибо!
В VB.NET есть команда WITH, которая позволяет опустить имя объекта и получать доступ только к имеющимся методам и свойствам. Например:
With foo
.bar()
.reset(true)
myVar = .getName()
End With
Есть ли такой синтаксис в Java?
Спасибо!
Нет. Лучшее, что вы можете сделать, когда выражение слишком длинное, - назначить его локальной переменной с коротким именем и использовать {...}
для создания области:
{
TypeOfFoo it = foo; // foo could be any lengthy expression
it.bar();
it.reset(true);
myvar = it.getName();
}
Возможно, самый близкий способ сделать это в 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
.
Однако, желание сделать это имеет тенденцию указывать на то, что объект не имеет достаточно насыщенного поведения. Попробуйте рефакторинг в вызываемый класс. Возможно, существует более одного класса, пытающегося выйти.
Вы можете довольно близко использовать 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
});
Это также возможно использование анонимного класса, но не так чисто.
Некоторые объекты позволяют вам "цепочки" вызовов метода, которые подходят к синтаксису, который вам нравится. Например, часто класс builder возвращается из методов, поэтому вы можете сделать что-то вроде этого:
MyObject b = new MyBuilder().setFoo(5).setBar(6).setBaz("garply!").build();
Каждый метод set...
возвращает this
, поэтому вы можете связать следующий вызов.
Неа. В 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();
Ближе всего к этому относится статический импорт, который позволит вам вызывать статические методы без явного указания класса, на котором существует этот метод.
Как уже было сказано, вы не можете писать код как это в Java.
Как комментарий, если вы боитесь многих копировать/вставлять в случае, когда вам нужно изменить имя переменной, Eclipse позволяет вам автоматически переименовать все ссылки переменной:
Используя ALT + SHIFT + R в имени переменной "foo", вы можете переименовать все одновременно в "myFoo", например:
Foo myFoo = new Foo();
myFoo.bar();
myFoo.reset(true);
Если у вас есть руки по реализации 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();
Наслаждайтесь!