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
'programing' 카테고리의 다른 글
문서 디렉토리에서 지정된 파일 삭제 (0) | 2023.05.10 |
---|---|
내 몽고드브를 어떻게 수리합니까? (0) | 2023.05.10 |
동적 식을 컴파일하는 데 필요한 하나 이상의 유형을 찾을 수 없습니다.Microsoft에 대한 참조가 누락되어 있습니까?CSSharp.dll 및 시스템.Core.dll? (0) | 2023.05.10 |
git에서 태그 간 커밋 목록 가져오기 (0) | 2023.05.10 |
[알림]이란 무엇입니까?속성 변경됨INOTIFY를 구현하는 경우 C#에서 Invocator]속성이 변경되었습니까? (0) | 2023.05.10 |