메서드의 정적 Import에 적합한 사용 사례는 무엇입니까?
방금 리뷰 코멘트를 받았는데, 제가 이 방법을 정적으로 가져오는 것은 좋은 생각이 아닙니다.스태틱 Import는 주로 스태틱메서드를 가진 DA 클래스의 메서드입니다.그래서 비즈니스 로직 중간에 현재 클래스에 속하는 것으로 보이는 da 액티비티가 있었습니다.
import static some.package.DA.*;
class BusinessObject {
void someMethod() {
....
save(this);
}
}
리뷰어는 내가 코드를 바꾸기를 원하지 않았고 나는 그렇게 하지 않았지만 나는 그의 말에 동의해.스태틱 Import를 하지 않는 이유 중 하나는 메서드가 어디에 정의되어 있는지 혼란스러웠기 때문입니다.현재 클래스에도 없고 슈퍼 클래스에도 없기 때문에 그 정의를 특정하는 데 시간이 걸립니다(Web 기반 리뷰 시스템에는 IDE:-와 같은 클릭 가능한 링크가 없습니다).이 문제는 스태틱import는 아직 완전히 새로운 것이므로 머지 않아 보입니다.e는 모두 위치를 찾는 데 익숙해질 것입니다.
그러나 다른 이유는 수식되지 않은 메서드콜이 현재 오브젝트에 속해 있는 것처럼 보여 컨텍스트를 건너뛰지 않는 것입니다.하지만 그게 진짜 속한다면, 그 슈퍼클래스를 연장하는 게 말이 될 거야.
그렇다면 정적 Import 방식은 언제 의미가 있을까요?언제 했어요?자격 없는 문의가 마음에 들었습니까?
EDIT: 아무도 그것을 현재 클래스의 방법으로 혼동하지 않을 경우 정적 Import 방식이 일반 의견인 것 같습니다.예를 들어 java.lang 메서드입니다.수학과 java.awt.색상. 하지만 복근과 getAlpha가 애매하지 않다면 readEmployee가 왜 애매한지 모르겠다.많은 프로그램 선택지가 그렇듯이, 이것도 개인적인 취향이라고 생각합니다.
이것은, Sun 의 가이드에 근거하고 있습니다(원래의 강조점).
정적 Import는 언제 사용해야 합니까?아주 조금!그렇지 않으면 상수의 로컬 복사본을 선언하거나 상속을 남용할 경우에만 사용하십시오(Constant Interface Antiattern).정적 가져오기 기능을 과도하게 사용하면 프로그램을 읽을 수 없고 유지 관리할 수 없게 되어 가져온 모든 정적 구성원으로 네임스페이스를 오염시킬 수 있습니다.코드(작성 후 몇 개월 경과)를 읽는 사람은 스태틱멤버가 어느 클래스 출신인지 알 수 없습니다.클래스에서 모든 스태틱멤버를 Import하면 가독성에 특히 해로울 수 있습니다.1개 또는 2개의 멤버만 필요한 경우 개별적으로 Import합니다.
(https://docs.oracle.com/javase/8/docs/technotes/guides/language/static-import.html)
구체적으로 다음 두 가지 부분을 언급하고 싶습니다.
- 정적 가져오기는 "상속 남용"을 원하는 경우에만 사용하십시오.이 경우 Business Object를 가지고 싶습니까?
extend some.package.DA
정적인 더일 수 그렇다면 정적 가져오기를 사용하는 것이 이 문제를 해결하는 더 깨끗한 방법이 될 수 있습니다.'은some.package.DA
수입하다입력할 때 몇 글자를 저장하는 데만 사용하지 마십시오. - 개개의 멤버를 Import 합니다.말합니다
import static some.package.DA.save
DA.*
그러면 이 Import 방법이 어디서 왔는지 쉽게 알 수 있습니다.
개인적으로 저는 이 언어 기능을 거의 사용하지 않고 상수나 어음에서만 사용합니다. 메서드에서는 사용하지 않습니다.그 균형은, 제게는, 거의 가치가 없습니다.
수입하다 버전의 에서는 JUnit 메서드(예: JUnit 메서드는 다음과 같습니다.assertEquals
★★★★★★★★★★★★★★★★★」fail
가 연장된 되었습니다.junit.framework.TestCase
.
// old way
import junit.framework.TestCase;
public class MyTestClass extends TestCase {
public void myMethodTest() {
assertEquals("foo", "bar");
}
}
4에서는 가 JUnit 4를 확장할 .TestCase
대신 주석을 사용할 수 있습니다. 다음 를 Import하다에서 수 .org.junit.Assert
:
// new way
import static org.junit.Assert.assertEquals;
public class MyTestClass {
@Test public void myMethodTest() {
assertEquals("foo", "bar");
// instead of
Assert.assertEquals("foo", "bar");
}
}
이런 식으로 JUnit 문서를 작성합니다.
유효 Java, Second Edition은 항목 19의 끝에 유틸리티 클래스의 상수를 많이 사용하는 경우 정적 가져오기를 사용할 수 있다는 점에 유의합니다.이 원리는 상수와 방법 양쪽의 정적 Import에 적용될 것이라고 생각합니다.
import static com.example.UtilityClassWithFrequentlyUsedMethods.myMethod;
public class MyClass {
public void doSomething() {
int foo = UtilityClassWithFrequentlyUsedMethods.myMethod();
// Can be written less verbosely as
int bar = myMethod();
}
}
이것은 장점과 단점이 있다.메서드가 정의되어 있는 위치에 대한 몇 가지 즉각적인 정보가 손실되는 대신 코드를 좀 더 읽기 쉽게 만듭니다.단, IDE가 좋으면 정의로 넘어갈 수 있기 때문에 큰 문제가 되지 않습니다.
Import된 파일의 파일을 여러 번 사용하는 경우에만 이 기능을 사용해야 합니다.
편집: 이 질문에서 언급한 메서드에 대해 좀 더 구체적으로 설명하도록 업데이트되었습니다.이 원칙은 가져오는 항목(상수 또는 방법)에 관계없이 적용됩니다.
때 util 클래스를 사용할 때 다중 할 때 편리하다고 생각합니다.Arrays
★★★★★★★★★★★★★★★★★」Assertions
.
왜 그랬는지는 모르겠지만 로스는 그가 언급하고 있는 문서에서 이것을 언급한 마지막 문장을 생략했다.
적절하게 사용하면 클래스 이름 반복의 보일러 플레이트를 제거하여 프로그램을 보다 읽기 쉽게 만들 수 있습니다.
기본적으로 다음 블로그에서 복사: https://medium.com/alphadev-thoughts/static-imports-are-great-but-underused-e805ba9b279f
예를 들어 다음과 같습니다.
테스트에서의 어설션
이것은 우리 모두가 동의하는 가장 명백한 사건이다.
Assertions.assertThat(1).isEqualTo(2);
// Use static import instead
assertThat(1).isEqualTo(2);
Utils 클래스 및 enum
많은 경우 utils 클래스를 사용할 때 클래스 이름을 삭제할 수 있으므로 코드를 쉽게 읽을 수 있습니다.
List<Integer> numbers = Arrays.asList(1, 2, 3);
// asList method name is enough information
List<Integer> numbers = asList(1, 2, 3);
java.time 패키지는 사용할 필요가 있는 경우가 몇 가지 있습니다.
// Get next Friday from now, quite annoying to read
LocalDate.now().with(TemporalAdjusters.next(DayOfWeek.FRIDAY));
// More concise and easier to read
LocalDate.now().with(next(FRIDAY));
사용하지 않는 경우의 예
// Ok this is an Optional
Optional.of("hello world");
// I have no idea what this is
of("hello world");
가독성 측면에서 문제가 있을 수 있으므로 적게 사용해야 한다는 데 동의합니다.그러나 일반적인 정적 방법을 사용하면 실제로 가독성을 높일 수 있습니다.를 들어JUnit과 같은 assertEquals
을 사용하다다음에서 온 메서드도 마찬가지로java.lang.Math
.
Color에 많이 써요.
static import java.awt.Color.*;
다른 색상과 혼동될 가능성은 거의 없습니다.
OpenGL을 Java와 함께 사용할 경우 정적 Import를 사용하는 것이 좋습니다.이것은 "유틸리티 클래스의 상수 사용" 카테고리에 속하는 사용 사례입니다.
그것을 고려하다
import static android.opengl.GLES20.*;
에서는, 원래의 C코드를 포토 해, 다음과 같이 판독 가능한 것을 쓸 수 있습니다.
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture);
glUniform1i(samplerUniform, 0);
glBindBuffer(GL_ARRAY_BUFFER, vtxBuffer);
glVertexAttribPointer(vtxAttrib, 3, GL_FLOAT, false, 0, 0);
일반적인 추악함 대신:
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texture);
GLES20.glUniform1i(samplerUniform, 0);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vtxBuffer);
GLES20.glVertexAttribPointer(vtxAttrib, 3, GLES20.GL_FLOAT, false, 0, 0);
import static java.lang을 사용합니다.수학 헤비 코드를 C/C++에서 Java로 포팅할 때 Math.*'를 선택합니다.이 계산 방식은 1과 1을 매핑하고 클래스 이름 인증 없이 포트화된 코드를 쉽게 확산할 수 있도록 합니다.
스태틱 Import는 Java의 유일한 "새로운" 기능으로, 지금까지 사용한 적도 없고 앞으로도 사용하지 않을 것입니다.
유틸리티 클래스를 이용할 때 매우 편리하다는 것을 알았습니다.
를 들어, '', '아까', '아까', '아까', '아까'를 예로 들 수 있습니다.if(CollectionUtils.isNotEmpty(col))
대신 다음을 수행할 수 있습니다.
import static org.apache.commons.collections.CollectionUtils.isNotEmpty;
if(isNotEmpty(col))
이 유틸리티를 코드로 여러 번 사용하면 어떤 IMO가 코드 판독성을 향상시킵니다.
유닛 테스트에 대해서:대부분의 사람들은 다음과 같은 모의 프레임워크에 의해 제공되는 다양한 정적 메서드에 정적 Import를 사용합니다.when()
★★★★★★★★★★★★★★★★★」verify()
.
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
그리고 물론, 하나뿐인 것을 사용할 때는assertThat()
다음과 같이 필요한 햄크레스트 매처를 정적으로 Import할 때 편리합니다.
import static org.hamcrest.Matchers.*;
특히 Import된 메서드가 많이 호출되고 로컬 메서드와 Import된 메서드의 구분이 명확할 경우 이러한 메서드는 상세 내용을 줄이는 데 유용합니다.
예를 들어 java.lang에 대한 여러 참조가 포함된 코드입니다.수학
기타:클래스 이름을 모든 참조 앞에 붙이면 빌드 중인 구조가 숨겨지는 XML 빌더 클래스입니다.
정적 Import는 Gettext 스타일의 NLS에 적합하다고 생각합니다.
import static mypackage.TranslatorUtil._;
//...
System.out.println(_("Hello world."));
둘 다 문자열을 추출해야 하는 문자열로 마크하고 문자열을 변환으로 쉽고 깔끔하게 대체할 수 있습니다.
IMO 스태틱 Import는 매우 편리한 기능입니다.스태틱 Import에 대한 의존도가 높기 때문에 코드를 읽을 수 없고 스태틱메서드 또는 Atribute가 어느 클래스에 속하는지 이해하기 어려운 것은 틀림없습니다.하지만 제 경험상, 특히 디자인을 할 때 사용할 수 있는 기능이 되었습니다.Util
몇 가지 정적 메서드 및 속성을 제공하는 클래스입니다.정적 Import를 제공할 때마다 발생하는 모호성은 코드 표준을 확립함으로써 회피할 수 있습니다.기업 내 경험상 이 접근방식은 받아들일 수 있으며 코드를 보다 깨끗하고 이해하기 쉽게 만듭니다.가능한 한,_
전면의 정적 방식 및 정적 속성(어느 정도 C에서 채택됨)의 문자.이 방법은 Java의 명명 표준을 위반하는 것으로 보이지만 코드를 명확하게 할 수 있습니다.예를 들어 AngleUtils 클래스가 있는 경우:
public class AngleUtils {
public static final float _ZERO = 0.0f;
public static final float _PI = 3.14f;
public static float _angleDiff(float angle1, float angle2){
}
public static float _addAngle(float target, float dest){
}
}
이 경우 정적 Import는 명확성을 제공하며 코드 구조가 더 우아해 보입니다.
import static AngleUtils.*;
public class TestClass{
public void testAngles(){
float initialAngle = _ZERO;
float angle1, angle2;
_addAngle(angle1, angle2);
}
}
스태틱 Import에서 어떤 메서드 또는 Atribute가 어떤 것인지 즉시 알 수 있으며, 이 메서드 또는 Atribute가 속한 클래스의 정보를 숨길 수 있습니다.모듈의 일부이며 정적 메서드와 비정적 메서드를 제공하는 클래스에는 정적 Import를 사용하지 않는 것이 좋습니다.이 경우 어떤 클래스가 특정 정적 기능을 제공하는지 아는 것이 중요합니다.
다음과 같은 경우에 사용해야 합니다.
- 는, 「」를 사용하고 싶다고 생각하고 있습니다.
switch
values를 한 - 코드를 이해하기 어렵게 만들고 싶다.
틈만 나면 쓰고 있어요.인텔리J는 내가 잊었을 때 상기시켜줄 설정이야정규 패키지 이름보다 훨씬 깨끗해 보이는 것 같아요.
언급URL : https://stackoverflow.com/questions/420791/what-is-a-good-use-case-for-static-import-of-methods
'programing' 카테고리의 다른 글
C의 시프트 연산자를 사용한 곱셈과 나눗셈이 실제로 더 빠릅니까? (0) | 2022.06.06 |
---|---|
Android 가상 장치를 만들 수 없습니다. (0) | 2022.06.06 |
"int"와 "unsigned int"의 진정한 차이 (0) | 2022.06.06 |
Vuex Store의 Unserve 상태 변수 (0) | 2022.06.06 |
Spring Rest Template로 폼 데이터를 POST하는 방법 (0) | 2022.06.06 |