programing

Java의 WITH 문

newsource 2023. 5. 10. 21:12

Java의 WITH 문

VB.NET에는 개체 이름을 생략하고 필요한 메서드와 속성에만 액세스할 수 있는 WITH 명령이 있습니다.예:

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

자바 내에 그런 구문이 있습니까?

감사합니다!

아니요. 표현식이 지나치게 길 때는 짧은 이름을 가진 로컬 변수에 할당하고 다음을 사용하는 것이 최선입니다.{...}범위를 만드는 방법:

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

아마도 자바에서 가장 가까운 방법은 이중 버팀대 관용구일 것입니다. 건설 중에 말이죠.

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 lamdas를 사용하여 상당히 가까워질 수 있습니다.

이 메서드를 선언합니다.

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다음 호출을 연결할 수 있습니다.

아니요. 자바는 장황함을 감소시킬 수 있는 어떤 것도 피하는 정책을 가지고 있습니다.

글쎄요, 이 글을 쓴 후에 가장 가까운 것은 정적인 수입일 수 있다는 생각이 들었습니다. 예를 들어,

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

이제 당신은 할 수 있습니다.

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

bar();

가장 가까운 것은 메서드가 존재하는 클래스를 명시적으로 지정하지 않고 정적 메서드를 호출할 수 있는 정적 가져오기입니다.

이미 말했듯이 자바에서는 코드를 이렇게 쓸 수 없습니다.

참고로 변수 이름을 변경해야 할 경우 많은 복사/붙여넣기가 두렵다면 Eclipse를 사용하여 변수의 모든 참조 이름을 자동으로 바꿀 수 있습니다.

"foo" 변수 이름에 ++SHIFTR를 사용하면 다음과 같이 모든 이름을 "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();

맛있게 드세요!

언급URL : https://stackoverflow.com/questions/1494800/with-statement-in-java