문제

그냥 없는 정적 가져오는 방법이 좋은 생각이 아니다.정적 가져오기의 방법에서 다스 클래스,이는 주로 정적인 방법입니다.그래서 중앙에서 비즈니스의 논리가 다는 활동을 분명히 속 듯하여 현재 클래스:

import static some.package.DA.*;
class BusinessObject {
  void someMethod() {
    ....
    save(this);
  }
} 

비평가였 치열하지 않는 코드를 변경하고 나가지 않았다 하지만 나는 종류의 동의 합니다.이유 중 하나는 주를 위해 정적 가져 있었다는 방법에 정의되었다,그것에는 현재 아니라 클래스에서 모든 수퍼 클래스 그래서 그것을 너무 일부를 확인하는 시간 정의(웹 기반 시스템을 검토하지 않는 링크를 클릭할 수 있 다음과 같 IDE:-)나는 진짜로 생각하지 않는 이 문제,정전기-수입품은 여전히 아주 새로운며 곧 우리는 모든 얻을 사용하여 찾는다.

그러나 다른 이유는 이에 동의하는 자격 없는 메소드를 호출하는 것 같이 속한 현재 개체하지는 상황.그러나 만약 그것이 정말았다 속한 것은 의미가 확장되는 수퍼 클래스입니다.

그래서 때 그것이 의미하는 정적 가져오는 방법이 있나요?을 때 당신이 그렇게 됩니까?았/당신은 당신과 같은 방법으로 규정되지 않은 통화를 보입니까?

편집:인기 있는 의견을 것 같다는 정적 가져오는 방법으면 아무도를 혼동하는 그들의 방법으로 현재 클래스입니다.예를 들어 방법에서 java.랭.수학과 java.awt.색상입니다.하지만 경우 abs getAlpha 는지 모르겠 readEmployee 입니다.로 많은 프로그래밍의 선택,내 생각이 너무 개인정 것입니다.

분에 대한 녀석,내가 닫기 질문입니다.

도움이 되었습니까?

해결책

이것은 태양에서의 가이드 할 때 그들은 출시 기능(에서 강조하는 원):

그래서 때을 사용해야 하는 정적 가져오? 매우 드물게! 는 경우에만 사용할 수 있는 유혹을 선언하는 지역의 사본은 상수 또는 학대로 상속(상수 인터페이스 안티패턴)....남용한 경우 정적 가져오기 기능을 할 수 있습니다,당신의 프로그램을 읽을 수 없게 unmaintainable,오염의 네임스페이스와 모든 정원할 수 있습니다.의 독자들에게 당신의 코드(를 포함하여 당신은,몇 개월 후에 당신은 그것을 썼다)알 수 없는 클래스 정원에서 비롯됩니다.가져오기 모두의 정적 멤버 클래스에서 수 있습니다 특히 유해를 가독성해야 하는 경우에만 하나 또는 두 개의 구성원,그들을 가져옵니다.

(https://docs.oracle.com/javase/8/docs/technotes/guides/language/static-import.html)

두 가지 부분 내가 원하는 구체적으로:

  • 사용 정체되는 수입품 할 때었는 유혹하는"학대 상속".이 경우에,당신은 되었을 유혹하고 있 BusinessObject extend some.package.DA?그렇다면,정체되는 수입될 수 있는 청소 방법의 취급이다.당신이 절대 꿈의 확장 some.package.DA, 다음,이것은 아마도 가난한 사용하여 정적 가져옵니다.그것을 사용하지 않는 저장하기 위해 몇 가지 문자를 입력하는 경우.
  • 가져오기 개인 회원입니다.import static some.package.DA.saveDA.*.는 것이 훨씬 쉽게 찾을 수 있는 곳이 가져오는 방법입니다.

개인적으로,나이어 기능 물,그리고 거의 항상만으로 상수하거나 열거형,결과 방법이 있습니다.문제,나를 위해,거의 절대 가치가있다.

다른 팁

다른 합리적인 사용에 대한 정적 수입으로 JUnit4.이전 버전의 JUnit 과 같은 방법 assertEqualsfail 들 때문에 상속 테스트 클래스를 확장 junit.framework.TestCase.

// old way
import junit.framework.TestCase;

public class MyTestClass extends TestCase {
    public void myMethodTest() {
        assertEquals("foo", "bar");
    }
}

JUnit4,테스트 수업이 더 이상 필요 없을 확장 TestCase 고할 수 있는 대신에 사용할 수 있습니다.할 수 있습니다 다음에 정적으로 가져오고 주장하는 방법에서 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, 의 끝에서, Item19 노트를 사용할 수 있는 정적인 수입을 자신 있으면 를 사용하여 상수에서 유틸리티 클래스입니다.이 원리가 적용될 것이 정체되는 수입품의 상수와 방법을 마련하고 있습니다.

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 이 당신을 가을의 정의,그래서 이되지 않는 문제입니다.

당신은 여전히 이 제품을 사용하며,경우에만 당신은 자신을 찾을 사용하는 것에서 파일이 가져온다는 것입니다.

편집: 업데이트를 더 구체적 방법으로는 이 질문을 참조.이 원칙이 적용됩에 관계없이 무엇을 가져올(상수 또는 방법).

나는 것에 동의하는 그들은 문제가 될 수 있습에서 가독성은 관점 및 자주 사용하지 않는 것이 좋습니다.그러나 사용할 때 일반적인 정적인 방법 그들은 실제로 증가를 가독성을 높입니다.예를 들어,JUnit 테스트 클래스,같은 방법 assertEquals 은 분명 그들은 어디에서 왔습니다.마찬가지로 방법에 java.lang.Math.

나는 그것을 사용해 색깔이 많습니다.

static import java.awt.Color.*;

그것은 매우 어렵다는 색상을 혼동으로 다른 것입니다.

내 생각에는 정적 가져오는 것은 정말 유용한을 제거하는 중복되는 클래스 이름을 사용할 때 utils 같은 클래스 ArraysAssertions.

지만 건너 로스의 마지막 문장을 언급하는 이에 설명서에서 그는 참조.

고 적절히 사용하고,정적 가져오기 프로그램을 만들 수 있습니다 가독성을 높일 수 있도록 여러를 제거하여 보일러의 반복의 클래스 이름.

기본적으로 복사에서 이 블로그: 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 클래스고 열거형

클래스 이름을 제거할 수 있는 많은 경우에 사용하는 경우미 클래스 코드에 쉽게 읽

List<Integer> numbers = Arrays.asList(1, 2, 3);

// asList method name is enough information
List<Integer> numbers = asList(1, 2, 3);

java.시간 패키지고 있는 몇 가지 경우가 그것을 사용해야

// 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");

정적인 수입은"새로운 기능"Java 나는 결코 사용되지 않으려는 이제까지 사용으로 인해 문제가 당신은 그냥 언급했다.

내가 사용하는'가져오기 static java.랭.수학.*' 포팅할 때 수학 중에서 코드 C/C++java.수학 방법 지도 1 1 과 비교 이식 코드가 쉽지 않고 클래스 이름을 자격이 있습니다.

나의 사용을 추천 정적 가져오기 을 사용할 때 효과와 Java 는 사용으로 떨어지는 경우 "무거운 사용하여 상수에서 유틸리티 클래스" 카테고리

을 고려하는

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

그들은 유용을 줄이 장황에서 특히 경우가 많이 수입된 방법을 호출되는 것,그 사이의 구별 수 방법은 분명하다.

한 가지 예:는 코드를 포함한 여러를 참조하 java.랭.수학

또: XML 빌더스 클래스 는 앞에 추가하여 명의 모든 참조 숨기 구조는 내장

내 생각에는 정적 수입품은 깔끔한 NLS 에 gettext-스타일입니다.

import static mypackage.TranslatorUtil._;

//...
System.out.println(_("Hello world."));

이 두 표시 문자열로 하는 문자열을 추출하고 쉽고 청결한 방법으로 대체하는 문자열로 번역이 있습니다.

IMO 정적 가져오는 매우 좋은 기능입니다.그것은 절대적 사실에 대한 신뢰도가 높아 정적 가져오는 코드를 읽고 이해하기 어려운 클래스 정적 방법 또는 특성이 있습니다.그러나,내가 그것을 경험가 사용할 수 있는 기능을 할 때 특히 디자인 Util 클래스를 제공하는 일부 정적 방법과 특성이 있습니다.모호함을 발생한 때마다 제공하는 정적 가져올 수 있는 피할을 수립하여 코드를 표준입니다.내 경험에는 회사 내에서 이러한 접근은 허용하고 코드를 깨끗하고 이해하기 쉽습니다.바람직하게는 내가 삽입 _ 문 앞에서 정적 방법과 정적 특성 (어떻게든에서 채택 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 static AngleUtils.*;

public class TestClass{

    public void testAngles(){

        float initialAngle = _ZERO;
        float angle1, angle2;
        _addAngle(angle1, angle2);
    }
}

바로 누군가에게 말할 수 있는 방법이나 특성에서 온 정적 가져오고 그것은 숨겨 정보 등이 속한다.내가 사용하는 것이 좋 정적 가져 있는 클래스에 대한 필수적인 부분의 모듈을 정적 및 비정적 방법으로 이러한 경우 그것은 중요한 알고 있는 클래스가 제공하는 특정한 정적 기능이 있습니다.

이야기에 대한 단위 테스트:대부분의 사람들이 사용 정체되는 수입품에 대한 다양한 정체되는 방법 조롱하는 프레임워크를 제공합 등 when()verify().

import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

그리고 물론을 사용할 때 하나만을 주장 당신이 사용해야`assertThat()간단을 정적으로 가져올 필요한 hamcrest 매칭으로서:

import static org.hamcrest.Matchers.*;

내가 이것을 발견하는 것은 매우 편리할 때 사용하는 유틸리티 클래스가 있습니다.

예를 들어,사용하는 대신: if(CollectionUtils.isNotEmpty(col))

나는 대신:

import static org.apache.commons.collections.CollectionUtils.isNotEmpty;
if(isNotEmpty(col))

는 IMO 증가 코드의 가독성을 사용할 때 이 유틸리티에서 여러 번 나의 코드입니다.

필요하신 경우에 사용:

  • 당신이 사용하기 switch 문을 열거 값
  • 당신이 원하는 코드를 이해하기 어려운 일

나는 그들을 사용할 때까지 할 수 있습니다.가 IntelliJ 설치를 생각 나게한 경우 나는 잊어 버려.나는 그것을 많기보다는 완전한 패키지의 이름입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top