인터페이스 상수의 사용은 무엇입니까?


123

Java를 배우고 있으며 인터페이스에 공개 정적 및 최종 필드가있을 수 있다는 것을 알았습니다. 나는 지금까지 이것들의 어떤 예도 보지 못했습니다. 이러한 인터페이스 상수의 사용 사례는 무엇이며 Java 표준 라이브러리에서 일부를 볼 수 있습니까?

답변:


190

정적 멤버를 인터페이스에 배치 (및 해당 인터페이스 구현) 하는 것은 나쁜 습관 이며 이름 인 Constant Interface Antipattern 도 있습니다. 효과적인 Java , 항목 17을 참조하십시오 .

상수 인터페이스 패턴은 인터페이스를 제대로 사용하지 않는 것입니다 . 클래스가 내부적으로 일부 상수를 사용한다는 것은 구현 세부 사항입니다. 상수 인터페이스를 구현하면이 구현 세부 사항이 클래스의 내 보낸 API로 유출됩니다. 클래스가 상수 인터페이스를 구현하는 것은 클래스 사용자에게 중요하지 않습니다. 사실, 혼란 스러울 수도 있습니다. 더 나쁜 것은 약속을 나타냅니다. 향후 릴리스에서 더 이상 상수를 사용할 필요가 없도록 클래스가 수정되는 경우에도 이진 호환성을 보장하기 위해 인터페이스를 구현해야합니다. 최종 클래스가 아닌 클래스가 상수 인터페이스를 구현하는 경우 모든 하위 클래스는 인터페이스의 상수에 의해 네임 스페이스가 오염됩니다.

Java 플랫폼 라이브러리에는 java.io.ObjectStreamConstants. 이러한 인터페이스는 이상 징후로 간주되어야하며 에뮬레이션해서는 안됩니다.

상수 인터페이스의 일부 함정을 피하려면 (사람들이 구현하는 것을 막을 수 없기 때문에) 개인 생성자가있는 적절한 클래스를 선호해야합니다 (예 : Wikipedia 에서 빌림 ).

public final class Constants {

    private Constants() {
        // restrict instantiation
    }

    public static final double PI = 3.14159;
    public static final double PLANCK_CONSTANT = 6.62606896e-34;
}

정규화 할 필요없이 (즉, 클래스 이름을 접두사로 지정할 필요없이) 상수에 액세스하려면 정적 가져 오기 (Java 5부터)를 사용하십시오.

import static Constants.PLANCK_CONSTANT;
import static Constants.PI;

public class Calculations {

    public double getReducedPlanckConstant() {
        return PLANCK_CONSTANT / (2 * PI);
    }
}

12
좋아,하지만 만약 당신이 상수 정의만을위한 것이 아닌 인터페이스를 가지고 있다면 어떨까요. 그래서 많은 클래스에 의해 구현되는 인터페이스가 있으며 메서드 선언이 포함되어 있지만 예를 들어 크기와 같은 일반적인 값도 추가하고 싶습니다. 이 경우 정말 나쁜 패턴입니까? 일반적으로 상수에 대한 인터페이스 만 만드는 것이 반 패턴이라는 데 동의합니다.
Łukasz Rzeszotarski

11
누군가가 책에서 그렇게 말했기 때문에 그것은 나쁜 것이 아닙니다. 해당 상수에 대한 액세스 권한을 얻기 위해 해당 인터페이스를 구현하지 않는 한 괜찮습니다.
ACV

11
아니요 아니요 아니요. Effective Java의 인용문은 다른 것에 대한 것입니다! 상수 만 인터페이스를 만드는 것이 이러한 상수를 보유하는 클래스보다 나은 대안입니다. 효과적인 자바는 "클래스가 내부적으로 일부 상수를 사용한다는 것은 구현 세부 사항입니다"라고 말합니다. 그러나 여기서는 그렇지 않습니다. 우리는 '전역'상수에 대해 이야기하고 있습니다. 그리고 메서드 선언없이 인터페이스를 구현하고 싶은 사람은 누구입니까?
ACV

6
ACV에 동의합니다. 상수 인터페이스가 내 보낸 API 모듈의 일부가 아니거나 구현되지 않은 경우 문제가 발생하지 않습니다. const 최종 클래스를 사용하는 것은 추악합니다. 사용하지 않기 때문에 코드를 복잡하게 만드는 개인 생성자가 필요합니다.
Lawrence

2
이 답변은 "Effective Java"라는 책의 주요 요점을 올바르게 제시하지 않습니다. 괄호로 묶어 요점을 "다운 그레이드"하기 때문입니다. "(및 해당 인터페이스 구현)". 대신 인터페이스의 상수 지점을 강조합니다 (이러한 인터페이스를 구현하지 않는 한 괜찮습니다). 인용 된 부분을주의 깊게 읽으면 "Effective Java"의 저자가 원래 의미했던 바를 알 수 있기 때문에 일반적으로 나쁜 대답은 아닙니다. 하지만 오해의 소지가 있습니다. 제 생각에 "그리고 그 인터페이스를 구현하는"부분은 그것을 강조하기 위해 굵은 글꼴로되어 있어야합니다.
krm

17

" 지속적인 인터페이스 패턴은 인터페이스를 잘 사용하지 않습니다. "

이 가설을 만든 사람은 누구든지 그 / 그녀가 전문가 일 수 있지만 나쁜 습관과 관행을 효율적으로 구현해야한다는 필요성을 기반으로 만들어졌습니다. 가설은 잘못된 소프트웨어 설계 습관의 타당성을 홍보하는 데 기반을두고 있습니다.

저는 여기에 그 가설에 대한 반박을 썼습니다. Java에서 상수를 구현하는 가장 좋은 방법은 무엇입니까? 이 가설의 근거 없음을 설명합니다.

내가이 가설을 정당화 한 이유를 게시 한 후 2 시간 이내에 그 질문이 닫힐 때까지 10 년 동안 그 질문은 열려 있었으며,이 잘못된 가설을 몹시 고수하는 사람들의 논쟁에 대한 UNWILLINGness를 드러 냈습니다.

이것이 제가 가설에 반하여 표현한 점입니다.

  • 이 가설을 유지하는 기초는 나쁜 소프트웨어 습관과 방법론의 영향에 대처하기위한 방법과 제한적 규칙이 필요하다는 것입니다.

  • " 일관된 인터페이스 패턴은 인터페이스를 제대로 사용 하지 않는다 " 라는 정서의 지지자들은 그러한 나쁜 습관과 관행의 영향에 대처할 필요가있는 이유 이외의 다른 이유를 제공 할 수 없습니다.

  • 근본적인 문제를 해결하십시오.

  • 그리고 Java 언어 구조의 모든 언어 기능을 최대한 활용하고 자신의 편의를 위해 활용하는 것은 어떻습니까? 재킷이 필요하지 않습니다. 왜 더 효과적인 라이프 스타일을 차별하고 유인하기 위해 당신의 비효율적 인 라이프 스타일을 막는 규칙을 발명합니까?

근본적인 문제

정보 조직입니다. 프로세스에 대한 솔루션을 엔지니어링하거나 보완하기 전에 프로세스를 매개하는 정보와 해당 정보의 동작을 소위 비즈니스 규칙과 함께 먼저 이해해야합니다. 이러한 정보 구성 방법은 수십 년 전에 데이터 정규화라고 불 렸습니다.

그러면 솔루션 구성 요소의 세분성 및 모듈성을 정보 구성 요소의 세분성 및 모듈 성과 일치시키는 것이 최적의 전략이기 때문에 솔루션의 엔지니어링 만 가능합니다.

정보를 구성하는 데 두세 가지 중요한 장애물이 있습니다.

  1. 데이터 모델 "정규화"의 필요성에 대한 인식 부족.

  2. 데이터 정규화에 대한 EF Codd의 진술은 결함이 있고 결함이 있으며 모호합니다.

  3. 애자일 엔지니어링으로 가장 한 최신 유행은 진행하면서 리팩토링 할 수 있기 때문에 앞으로의 모듈 구성을 계획하고 조정해서는 안된다는 잘못된 생각입니다. 미래의 발견에 지장을받지 않는 리팩토링과 지속적인 변화가 변명으로 사용됩니다. 프로세스 정보의 행동에 대한 필수적인 발견은 회계 속임수를 사용하여 수익과 자산화를 지연시키는 것입니다. 따라서 지금은 필수적인 지식과 그 처리가 필요하지 않은 것으로 간주됩니다.

인터페이스 상수를 사용하는 것이 좋습니다.

임시 뺑소니 프로그래밍 습관을 좋아한다고해서 규칙을 만들거나 그것에 반대하는 어떤 조치도하지 마십시오.

총을 다루는 방법을 모르거나 총을 남용하는 경향이있는 사람들이 있다는 이유로 총 소유권을 금지하지 마십시오.

당신이 만든 규칙이 전문적으로 코딩 할 수없는 프로그래밍 초보자를위한 것이고 그들 사이에서 당신 자신을 생각한다면 그렇게 말하십시오-당신의 fatwa를 적절하게 정규화 된 데이터 모델에 적용 할 수 있다고 선언하지 마십시오.

어리석은 추론-인터페이스는 그런 방식으로 사용되도록 자바 언어의 허풍에 의해 의도되지 않았습니까?

저는 미국 헌법에 대한 건국의 아버지들의 원래 의도가 무엇인지 상관하지 않습니다. 나는 문서화되지 않은 의도를 신경 쓰지 않는다. 나는 서면 헌법에 문자 적으로 성문화 된 내용과 사회의 효과적인 기능을 위해 어떻게 활용할 수 있는지에 만 관심이 있습니다.

저는 Java 언어 / 플랫폼 사양이 허용하는 것에 만 관심이 있고이를 최대한 활용하여 소프트웨어 솔루션을 효율적이고 효과적으로 표현할 수있는 매체를 제공 할 계획입니다. 재킷이 필요하지 않습니다.

Enum 상수의 사용은 실제로 끔찍한 연습입니다.

매개 변수를 값에 매핑하려면 추가 코드를 작성해야합니다. Java의 창립자가 사용자가 작성하지 않고는 매개 변수 값 맵핑을 제공하지 않았다는 사실은 맵핑 코드가 Enum 상수를 보여 준다는 사실은 의도하지 않은 Java 언어 사용과 같습니다.

특히 매개 변수를 정규화하고 구성 요소 화하도록 권장하지 않기 때문에 Enum 백에 혼합 된 매개 변수가 동일한 차원에 속한다는 잘못된 인상이있을 수 있습니다.

상수는 API 계약입니다.

잊지 마세요. 데이터 모델을 설계하고 정규화하고 여기에 상수가 포함 된 경우 해당 상수는 계약입니다. 데이터 모델을 정규화하지 않았다면 그 나쁜 습관에 대처하기 위해 제한적 코딩을 연습하는 방법에 대한 fatwas를 준수해야합니다.

따라서 인터페이스는 Constants의 계약을 구현하는 완벽한 방법입니다.

이상한 추정-인터페이스가 우연히 구현되면 어떨까요?

예. 누구나 실수로 인터페이스를 실수로 구현할 수 있습니다. 그러한 부주의 한 프로그래머를 방해하는 것은 없습니다.

누출에 대한 데이터 모델 설계 및 정규화

계약되지 않은 / 잘못된 매개 변수가 API로 유출되는 원인이 될 것으로 추정되는 나쁜 관행을 보호하기 위해 제한적인 법령을 두지 마십시오. 인터페이스 상수를 비난하기보다는 근본적인 문제를 해결하십시오.

IDE를 사용하지 않는 것은 나쁜 습관입니다

정상적인 기능과 효과적인 프로그래머는 그녀가 수중에 얼마나 오래 머물 수 있는지, 맹렬한 더위 나 습한 뇌우 속에서 얼마나 멀리 걸을 수 있는지 증명하기 위해 거기에 있지 않습니다. 그녀는 매일 10 마일을 일하기 위해 자동차 나 버스 또는 최소한 자전거와 같은 효율적인 도구를 사용해야합니다.

IDE없는 프로그래밍에 대한 난해한 금욕주의에 집착한다고해서 동료 프로그래머에게 제한을 두지 마십시오.

프로그래머가 나쁜 습관을 효율적으로 계속 연습 할 수 있도록 몇 가지 프레임 워크가 설계되었습니다.

OSGI는 그러한 프레임 워크입니다. 인터페이스 상수에 대한 법령도 마찬가지입니다.

따라서 결정적인 대답은 ...

인터페이스 상수는 데이터 모델의 잘 디자인되고 정규화 된 구성 요소를 계약에 배치하는 효과적이고 효율적인 방법입니다.

클래스 파일에 중첩 된 적절하게 이름이 지정된 개인 인터페이스의 인터페이스 상수는 파일 전체에 분산되지 않고 모든 개인 상수를 그룹화하는 좋은 방법입니다.


29
농담, 풍자, 감정없이 모든 포인트를 만들 수 있습니다. Stackoverflow는 블로깅 플랫폼이 아닙니다.
tkruse

1
"나는 미국 헌법에 대한 건국의 아버지들의 원래 의도가 무엇인지 신경 쓰지 않습니다. 저는 문서화되지 않은 성문화 된 의도에 대해서는 신경 쓰지 않습니다. 저는 문서화 된 헌법에 문학적으로 성문화 된 의도와 그것들을 어떻게 이용할 수 있는지에 만 관심이 있습니다. 사회의 효과적인 기능. " -그건 좋은 우화가 아니에요?
Blessed Geek

"매개 변수를 값에 매핑하기 위해 추가 코드를 작성해야합니다. 매핑 코드가 Enum 상수를 보여주지 않고 Java 창립자가 매개 변수 값 매핑을 제공하지 않았다는 사실은 의도하지 않은 Java 언어 사용과 동일합니다." 추가 코드를 작성하지 않고 매개 변수 값 매핑을 어떻게 얻을 수 있습니까?
GabrielOshiro

인터페이스 상수를 사용하십시오. 바로 그거죠.
Blessed Geek

9

나는이 오래된 질문을 여러 번 보았고 받아 들여지는 대답은 여전히 ​​나를 혼란스럽게합니다. 많은 생각 끝에이 질문이 더 명확해질 수 있다고 생각합니다.

인터페이스 상수를 사용하는 이유는 무엇입니까?

비교해보세요.

public final class Constants {

    private Constants() {
        // restrict instantiation
    }

    public static final double PI = 3.14159;
    public static final double PLANCK_CONSTANT = 6.62606896e-34;
}

vs

public interface Constants {

    double PI = 3.14159;
    double PLANCK_CONSTANT = 6.62606896e-34;
}

같은 사용법. 훨씬 적은 코드.

나쁜 습관?

@Pascal Thivent의 답변에 잘못된 강조가 있다고 생각합니다. 여기에 내 버전이 있습니다.

정적 멤버를 인터페이스에 넣고 해당 인터페이스 를 구현하는 것은 나쁜 습관입니다.

Effective Java의 인용문에는 다른 사람들이 지속적인 인터페이스를 구현하고 있다는 가정이 있습니다.

과 같은 이름의 상수 인터페이스를 만들 때 Constants누구도 구현해서는 안됩니다. (기술적으로 가능하지만 여기서 유일한 문제입니다)

표준 라이브러리에서는 발생하지 않습니다.

표준 라이브러리는 디자인의 오용 가능성을 감당할 수 없으므로 거기에서 아무것도 볼 수 없습니다.

그러나 일반 개발자의 일상적인 프로젝트의 경우 상수 인터페이스를 사용하는 것이 훨씬 쉽습니다 static. final,,empty constructor , 등, 그리고 어떤 나쁜 디자인의 문제가 발생하지 않습니다. 내가 생각할 수있는 유일한 단점은 여전히 ​​"인터페이스"라는 이름이 있지만 그 이상은 없다는 것입니다.

끝없는 논쟁

결국 나는 모든 사람들이 책을 인용하고 그들의 입장에 대한 의견과 정당성을 부여한다고 생각합니다. 나를위한 예외는 없습니다. 결정은 여전히 ​​각 프로젝트의 개발자에게 달려 있습니다. 당신이 편안하다고 느끼면 계속 사용하십시오. 우리가 할 수있는 최선 은 프로젝트 전체에서 일관성을 유지하는 것 입니다.


"정적 멤버를 인터페이스에 넣고 해당 인터페이스를 구현하는 것은 나쁜 습관입니다." 아니에요
Raining

수정자는 public인터페이스이기 때문에 생략 할 수도 있습니다. 간단히 double PI = 3.14159;Usage of Constants.PIConstants인터페이스 를 구현하기 위해 이것을 사용하는 클래스가 필요하지 않습니다 ! 인터페이스 접근 방식은 사용 측면에서 훨씬 더 깔끔하다고 생각합니다. IMHO
krozaine

@krozaine 업데이트되었습니다. 알림 주셔서 감사합니다. 의심이있는 사람을위한 참조 : "인터페이스에 정의 된 모든 상수 값은 암시 적으로 공개, 정적 및 최종입니다." - docs.oracle.com/javase/tutorial/java/IandI/interfaceDef.html
나카무라

6

Joshua Bloch, "Effective Java-Programming Language Guide":

상수 인터페이스 패턴은 인터페이스를 제대로 사용하지 않는 것입니다. 클래스가 내부적으로 일부 상수를 사용한다는 것은 구현 세부 사항입니다. 상수 인터페이스를 구현하면이 구현 세부 사항이 클래스의 내 보낸 API로 유출됩니다. 클래스가 상수 인터페이스를 구현하는 것은 클래스 사용자에게 중요하지 않습니다. 사실, 혼란 스러울 수도 있습니다. 더 나쁜 것은 약속을 나타냅니다. 향후 릴리스에서 더 이상 상수를 사용할 필요가 없도록 클래스가 수정되는 경우에도 이진 호환성을 보장하기 위해 인터페이스를 구현해야합니다. 최종 클래스가 아닌 클래스가 상수 인터페이스를 구현하는 경우 모든 하위 클래스는 인터페이스의 상수에 의해 네임 스페이스가 오염됩니다.


당신은 말 그대로 아직 말하지 않은 가치를 추가하지 않았습니다.
Donal Fellows


2

매우 공감하는 답변이 있습니다.

하지만이 질문에 대해 몇 가지 생각이 있습니다. (틀릴 수 있음)

제 생각에, 인터페이스의 필드는 전체 프로젝트에 대한 상수가 아니어야합니다. 그것들은 인터페이스를위한 수단 일 뿐이며 인터페이스는 인터페이스를 확장하고 이러한 인터페이스를 구현하거나 그들과 밀접한 관계를 갖는 클래스입니다. 글로벌이 아닌 특정 범위 내에서 사용해야합니다.


실제로 이러한 구현 클래스 내에서 사용해야합니다.
Raining

2

인터페이스에 대한 두 가지 사항 :

  • 인터페이스는 를 구현 하는 객체 가 수행 할 수있는 작업 의 하위 집합 을 설명 합니다 . (이것이 직감입니다)

  • 인터페이스는이 를 구현하는 객체 가 따르는 공통 상수를 설명 합니다.

    • 이러한 공통 상수 이러한 객체에 대해 더 많이 알기 위해 클라이언트가 알 수 있도록 고안 되었습니다.
    • 그래서 상수 인터페이스는 참으로 정의하는 직관적 인 글로벌 상수 인터페이스를 설명하는 데 사용되기 때문에, 일부 개체 가 아닌 모든 개체를 / 어떤 객체 (의 의미를 고려하지 글로벌을 ).

따라서 Constants Interface전역 상수에 사용되지 않으면 허용됩니다.

  • 이러한 공통 상수 에 좋은 이름 이 있으면 구현 자에게 사용하도록 권장 합니다 (아래 예제에 대한 첫 번째 요점 참조).
  • 클래스가 사양을 따르는 클래스와 동기화하려는 경우 해당 클래스 만 동기화 implements합니다 (물론 구현시 이러한 공통 상수를 사용합니다).

예:

interface Drawable {

    double GOLDEN_RATIO = 1.618033988;
    double PI = 3.141592653;
    ...

    // methods
    ...
}

public class Circle implements Drawable {
    ...
    public double getCircumference() {
        return 2 * PI * r;
    }
}

void usage() {

    Circle circle = new Circle(radius: 3.0);
    double maxRadius = 5.0;

    if ( circle.getCircumference() < 2 * Circle.PI * maxRadius ) {
        ...
    }

}

이 예에서 :

  • 에서 Circle implements Drawable, 당신은 바로 그 아는 Circle아마에 정의 된 상수에 따른다 Drawable그렇지 않으면 좋은 것들 때문에 더 나쁜 이름을 선택해야 PI하고 GOLDEN_RATIO이미 촬영되었습니다!
  • 만 이러한 Drawable오브젝트는 특정을 준수 PI하고 GOLDEN_RATIO정의 Drawable없는,있을 수있는 개체 Drawable파이와 황금 비율의 다른 정밀.

내가 당신의 대답을 오해 했습니까? 아니면 인터페이스의 목적을 오해 했습니까? 인터페이스는 하위 집합이 아닙니다. 인터페이스는 계약이며, 계약을 구독하는 사람은 해당 계약에 지정된 상호 작용을 제공해야합니다. 인터페이스의 유일한 유효한 사용은 계약을 선언 / 이행하는 데 사용하는 것입니다.
Blessed Geek

@BlessedGeek 계약을 이행하면 계약에 설명 된 능력이 수행 할 수있는 작업의 하위 집합입니다.
비가

1

javax.swing.SwingConstants인터페이스 스윙 클래스 중 사용되는 정적 필드를 가지고 예이다. 이렇게하면 다음과 같은 것을 쉽게 사용할 수 있습니다.

  • this.add(LINE_START, swingcomponent);
  • this.add(this.LINE_START, swingcomponent); 또는
  • this.add(SwingComponents.LINE_START, swingcomponent);

그러나이 인터페이스에는 메소드가 없습니다 ...


1

나는이 질문을 보았고 언급되지 않은 것을 추가 할 것이라고 생각했습니다. 일반적으로, 나는 파스칼의 대답에 동의 여기 . 그러나 저는 인터페이스의 상수가 "항상"반 패턴이라고 생각하지 않습니다.

예를 들어 정의하는 상수가 해당 인터페이스에 대한 계약의 일부인 경우 인터페이스가 상수를위한 좋은 장소라고 생각합니다. 어떤 경우에는 구현 사용자에게 계약을 노출하지 않고 매개 변수를 비공개로 검증하는 것이 적절하지 않습니다. 공개 계약이 없으면 사용자는 클래스를 디 컴파일하고 코드를 읽는 것없이 유효성 검사를 추측 할 수 있습니다.

따라서 인터페이스를 구현하고 인터페이스에 계약을 보장하는 데 사용하는 상수 (예 : 정수 범위)가있는 경우 클래스 사용자는 인터페이스의 상수를 확인하여 인터페이스 인스턴스를 올바르게 사용하고 있는지 확인할 수 있습니다. 그들 자신. 상수가 구현에 전용이거나 구현이 패키지 전용이거나 다른 경우 불가능합니다.


1
인터페이스 및 상수의 문제는 설명하는 방식으로 인터페이스에 상수를 추가 할 수 있지만 API 소비자가 실제로 해당 상수를 사용하도록 강제하는 바인딩은 없습니다.
Daniel

@Daniel : 귀하의 의견을 찬성했지만 이제 귀하의 질문에 대한 좋은 설명이 있습니다. "API 소비자가 실제로 상수를 사용하도록 강제하는 바인딩이 없습니다."하지만 이제 클라이언트는 더 이상 CONSTANT_NAME을 사용할 수 없습니다. 저에게 좋은 징조입니다!
Raining

따라서 상수 이름은 클래스에서 사용할 수 없지만 상수 이름을 똑같은 이름으로 지정한다고 가정합니다. 인터페이스를 사용하여 상수를 표현하는 것은 여전히 ​​오류이며 인터페이스는 API에 대한 계약입니다. 상수 값을 나타내는 데 사용해서는 안됩니다.
Daniel

-1

클래스 간 공유 상수를 다룰 때 인터페이스 상수를 사용합니다.

public interface TestConstants
{
    String RootLevelConstant1 = "RootLevelConstant1";

    interface SubGroup1
    {
        String SubGroupConstant1 = "SubGroup1Constant1";
        String SubGroupConstant2 = "SubGroup1Constant2";
    }

    interface SubGroup2
    {
        String SubGroupConstant1 = "SubGroup2Constant1";
        String SubGroupConstant2 = "SubGroup2Constant2";
    }
}

그룹화는 특히 큰 상수 세트가있는 거대한 자산입니다.

사용하려면 간단히 연결하면됩니다.

System.out.println(TestConstants.SubGroup1.SubGroupConstant1);
System.out.println(TestConstants.SubGroup2.SubGroupConstant1);
System.out.println(TestConstants.RootLevelConstant1);

동의합니다. 기본적으로 공용 정적 최종 필드가있는 공용 추상 클래스와 동일하지만 훨씬 적은 단어입니다. 필요한 것은 팀의 모든 개발자가 모범 사례를 따르고 이러한 인터페이스를 구현하지 않도록하는 것입니다.
야 오르

1
이것은 끔찍한 일입니다. Classes와 똑같은 일을 할 수 있고, 같은 방식으로 접근 할 수 있고, 클래스를 final로 만들고, 생성자를 비공개로 만들 수 있기 때문입니다. 또한 사람들이 수업을 연장하는 것을 피합니다. 당신은 당신의 인터페이스를 구현하는 사람들을 피할 수 없습니까?
GabrielOshiro

1
클래스에서 인터페이스에서 할 수있는 작업을하는 이유는 무엇입니까 ?? 사람들이 실수로 인터페이스를 전혀 구현하지 못하도록 방지하는 방법이 문제입니다. 인터페이스 상수를 선택하는 이유는 무엇입니까?
Blessed Geek

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.