web-dev-qa-db-ja.com

Java

VB.NETには、オブジェクト名を省略して、必要なメソッドとプロパティにのみアクセスできるWITHコマンドがあります。例えば:

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

Java内にそのような構文はありますか?

ありがとう!

31
Mike Clark

いいえ。式が長すぎる場合にできる最善の方法は、式を短い名前のローカル変数に割り当て、{...}を使用してスコープを作成することです。

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

おそらく、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を返します。

ただし、これを実行したい場合は、オブジェクトに十分な動作がないことを示している傾向があります。呼び出されたクラスにリファクタリングしてみてください。おそらく、抜け出そうとしているクラスが複数あります。

17

Java 8ラムダを使用すると、ローカル変数を変更できないという欠点がありますが、かなり近づくことができます。

このメソッドを宣言します。

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
});

これは匿名クラスを使用して行うこともできますが、それほどクリーンではありません。

13
jpfreire

一部のオブジェクトでは、メソッド呼び出しを「チェーン」して、好みの構文に近づけることができます。たとえば、多くの場合、ビルダークラスはメソッドから自分自身を返すため、次のようなことができます。

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

set...メソッドはthisを返すため、次の呼び出しを連鎖させることができます。

6

いいえ。 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();
4
Steve B.

これに最も近いのは、メソッドが存在するクラスを明示的に指定せずに静的メソッドを呼び出すことができる静的インポートです。

3
daveb

すでに述べたように、Javaでこのようにコードを実際に書くことはできません。

コメントと同じように、変数名を変更する必要がある場合に多くのコピー/貼り付けに不安がある場合、Eclipseでは変数のすべての参照の名前を自動的に変更できます。

使用する ALT+SHIFT+R 「foo」変数名では、たとえば、一度に「myFoo」に名前を変更できます。

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

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();

楽しい!

0
Alex C.