34

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

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

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

ありがとう!

4

8 に答える 8

33

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

{
   TypeOfFoo it = foo; // foo could be any lengthy expression
   it.bar();
   it.reset(true);
   myvar = it.getName();
}
于 2009-09-29T20:40:31.467 に答える
16

おそらく、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();

ここでbarresetメソッドはを返しthisます。

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

于 2009-09-29T20:43:59.433 に答える
15

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

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

于 2014-03-27T15:27:31.530 に答える
6

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

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

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

于 2009-09-29T20:44:32.350 に答える
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();
于 2009-09-29T20:39:54.667 に答える
3

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

于 2009-09-29T20:41:31.277 に答える
2

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

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

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

Foo myFoo = new Foo();
myFoo.bar();
myFoo.reset(true);
于 2014-05-21T14:11:12.247 に答える
0

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

楽しみ!

于 2019-09-04T13:18:56.980 に答える