상수를 보유하는 클래스를 정의해야한다고 가정합니다.
public static final String SOME_CONST = "SOME_VALUE";
이 작업을 수행하는 데 선호되는 방법은 무엇입니까?
- 상호 작용
- 추상 클래스
- 최종 수업
어떤 것을 사용해야하며 그 이유는 무엇입니까?
일부 답변에 대한 설명 :
열거 형 – 열거 형 을 사용하지 않을 것입니다. 아무것도 열거하지 않고 어떤 식 으로든 서로 관련이없는 상수를 수집합니다.
인터페이스 – 인터페이스 를 구현하는 클래스로 설정하지 않을 것입니다. 인터페이스를 사용하여 다음과 같이 상수를 호출하고 싶습니다 ISomeInterface.SOME_CONST
.
답변
최종 수업을 사용하십시오. 단순함을 위해 정적 가져 오기를 사용하여 다른 클래스에서 값을 재사용 할 수 있습니다.
public final class MyValues {
public static final String VALUE1 = "foo";
public static final String VALUE2 = "bar";
}
다른 수업에서 :
import static MyValues.*
//...
if(variable.equals(VALUE1)){
//...
}
답변
귀하의 설명은 다음과 같습니다. “열거 형을 사용하지 않을 것입니다. 아무 것도 열거하지 않고 어떤 식 으로든 서로 관련이없는 일부 상수 만 수집합니다.”
상수가 서로 전혀 관련이없는 경우 왜 함께 수집하고 싶습니까? 가장 밀접하게 관련된 클래스에 각 상수를 넣으십시오.
답변
내 제안 (내림차순) :
1) 하지 마십시오 . 가장 관련성이 높은 실제 클래스에서 상수를 만듭니다. ‘상수 가방’클래스 / 인터페이스를 갖는 것은 실제로 OO 모범 사례를 따르는 것이 아닙니다.
나와 다른 모든 사람들은 때때로 # 1을 무시합니다. 그렇게하려는 경우 :
2) 개인 생성자 가있는 최종 클래스 이것은 적어도 상수에 쉽게 접근 할 수 있도록 확장 / 구현함으로써 누군가가 당신의 ‘상수 가방’을 남용하는 것을 막을 것입니다. (당신이 이것을하지 않겠다고 말한 것을 압니다.하지만 당신이 그렇게하지 않을 사람이 따라 오는 것은 아닙니다)
3) interface 이것은 작동하지만 # 2에서 가능한 남용 언급을 제공하는 선호하는 것은 아닙니다.
일반적으로 이것이 상수이기 때문에 정상적인 oo 원칙을 적용해서는 안된다는 의미는 아닙니다. 하나의 클래스 만 상수에 대해 신경 쓰지 않는 경우-해당 클래스에 비공개 여야합니다. 테스트 만 상수에 관심이 있다면 프로덕션 코드가 아닌 테스트 클래스에 있어야합니다. 상수가 여러 위치에서 정의 된 경우 (실수로 동일하지 않음)-리팩터링하여 중복을 제거합니다. 등등-당신이 방법처럼 그들을 대하십시오.
답변
Joshua Bloch는 Effective Java에서 다음과 같이 말합니다.
- 인터페이스는 유형을 정의하는 데만 사용해야합니다.
- 추상 클래스는 불안정성을 방지하지 않습니다 (하위 클래스 화 될 수 있으며 서브 클래스 화되도록 설계되었음을 제안 할 수도 있음).
모든 상수가 관련되어있는 경우 (예 : 행성 이름) Enum을 사용하거나, 관련된 클래스에 상수 값을 넣거나 (액세스 권한이있는 경우), 비 인스턴트 가능한 유틸리티 클래스 (개인 기본 생성자 정의)를 사용할 수 있습니다. .
class SomeConstants
{
// Prevents instanciation of myself and my subclasses
private SomeConstants() {}
public final static String TOTO = "toto";
public final static Integer TEN = 10;
//...
}
그런 다음 이미 언급했듯이 정적 가져 오기를 사용하여 상수를 사용할 수 있습니다.
답변
내가 선호하는 방법은 전혀하지 않는 것입니다. 상수의 시대는 Java 5가 typesafe enum을 도입했을 때 거의 죽었습니다. 그리고 그 전에도 Josh Bloch는 Java 1.4 (및 그 이전 버전)에서 작동하는 (약간 더 장황한) 버전을 발표했습니다.
레거시 코드와의 상호 운용성이 필요하지 않는 한 더 이상 명명 된 문자열 / 정수 상수를 사용할 이유가 없습니다.
답변
마지막 수업을 사용하십시오.
다른 값을 추가하려면 추상 클래스를 사용하십시오.
인터페이스를 사용하는 것은 의미가 없으며 인터페이스는 계약을 지정해야합니다. 상수 값을 선언하고 싶을뿐입니다.