우선 내가 '상수 개체'라는 용어는 아마도 옳지 않은 것이며 이미 내가 생각한 것과 완전히 다른 것을 의미 할 수도 있지만 그것이 내가 무엇인지 설명하기 위해 생각할 수있는 가장 좋은 용어라고 말할 수 있습니다. 에 대해 말하다.상수 개체를 구현하는 가장 좋은 방법은 무엇입니까?
기본적으로 나는 응용 프로그램을 설계하고 있으며 아마도 기존 설계 패턴이있는 것처럼 보였지만 그 장치가 무엇인지 또는 무엇을 검색해야하는지 모르기 때문에 무엇을 설명 할 것인가? 그것은 노력하고 있으며 그것을 구현하는 가장 좋은 방법에 대한 제안을 찾고 있습니다.
는 클래스가 있다고 가정하자 :
public class MyClass {
private String name;
private String description;
private int value;
public MyClass(String name, String description, int value) {
this.name = name;
this.description = description;
this.value = value;
}
// And I guess some getters and setters here.
}
이제 당신은 오직이 클래스의 3 개 인스턴스가 말을 할 것이라는 점을 미리 알고, 데이터도 사전에 알려져 있다고 (또는에서 할 수 있습니다 런타임시 파일에서 최소한 읽을 것이고 정확한 파일 이름은 미리 알려짐). 기본적으로 내가 얻는 것은 런타임 중에 데이터가 변경되지 않는다는 것입니다 (일단 설정되면).
처음에는 정적 정수를 어딘가에 선언해야한다고 생각했습니다. 난 그냥 상수를 직접 참조 할 수있는 3 개 인스턴스 중 하나를 사용할 때마다 지금 Obvisouly
public static final String INSTANCE_1_DATA_FILE = "path/to/instance1/file";
public static final String INSTANCE_2_DATA_FILE = "path/to/instance2/file";
public static final String INSTANCE_3_DATA_FILE = "path/to/instance3/file";
public static final MyClass INSTANCE_1 = new MyClass(getNameFromFile(INSTANCE_1_DATA_FILE), getDescriptionFromFile(INSTANCE_1_DATA_FILE), getValueFromFile(INSTANCE_1_DATA_FILE));
public static final MyClass INSTANCE_2 = new MyClass(getNameFromFile(INSTANCE_2_DATA_FILE), getDescriptionFromFile(INSTANCE_2_DATA_FILE), getValueFromFile(INSTANCE_2_DATA_FILE));
public static final MyClass INSTANCE_3 = new MyClass(getNameFromFile(INSTANCE_3_DATA_FILE), getDescriptionFromFile(INSTANCE_3_DATA_FILE), getValueFromFile(INSTANCE_3_DATA_FILE));
.
하지만이 처리하는 깔끔한 방법과 내가 좋아하는 일을했다 생각 다음 일은있을 수 있다고 생각하기 시작 : 나는 인스턴스를 사용할 때마다 이제
public MyClassInstance1 extends MyClass {
private static final String FILE_NAME = "path/to/instance1/file";
public String getName() {
if (name == null) {
name = getNameFromFile(FILE_NAME);
}
return name;
}
// etc.
}
MyClass를 사용하면 원하는대로 사용할 수 있습니다.
private MyClass myInstance = new MyClassInstance2();
또는 아마 더 나은 그들에게 싱글을 만들 수 그냥 할 것 :
private MyClass myInstance = MyClassInstance3.getInstance();
하지만 도움이되지만이이 상황을 처리 할 수있는 올바른 방법이 아니라고 생각 할 수 없다. 문제를 너무 과소 평가하고 있습니까? 예를 들어 switch 문을 어딘가에 사용해야합니까?
public class MyClass {
public enum Instance { ONE, TWO, THREE }
public static String getName(Instance instance) {
switch(instance) {
case ONE:
return getNameFromFile(INSTANCE_1_DATA_FILE);
break;
case TWO:
etc.
}
}
}
아무에게도 이것을 구현하는 가장 좋은 방법을 말할 수 있습니까? Java에서 샘플 코드를 작성했는데 이것이 가장 강한 언어이기 때문에 C++로 응용 프로그램을 구현할 것입니다. 그래서 현재 언어 독립적 인 디자인 패턴을 찾고 있습니다. 이미 언급 한 간단한 해결책 중 하나를 선택하십시오).
수업이 실제로하는 일에 대해 자세히 설명해 주시겠습니까? 전역 변수 노출은 객체 지향적이지 않으며 코드를 변경하기가 매우 어렵습니다 (이러한 변수와 높은 결합이있는 경우). 어쩌면 3 가지 글로벌 인스턴스가 필요한 것보다 나은 방법이있을 수 있습니다. 자바 세계에서는 스프링과 같은 프레임 워크를 사용하여 필요한 곳에 변수를 삽입 할 수 있습니다. C++에는 확실하지 않습니다. –
좋아, 그래서 내 응용 프로그램에 대한 도메인 모델링 오전 '일'잔뜩있을 것입니다. 매일 매일 활동 평가가 있으며 활동 등급은이 세 가지 상수 (기본적으로 낮음, 중간 및 높음)입니다. 응용 프로그램의 UI가 특정 날짜의 활동 등급에 대한 이름과 설명을 표시해야하기 때문에 해당 객체를 객체로 사용해야한다고 생각했습니다. 내부적으로이 값은 계산에 사용됩니다. 그냥 할 수 있다면 좋을 거라 생각 했어 .setActivityRating (MEDIUM); 중간 행위 평가 객체는 모든 행동을 처리 할 것이다. – DaveJohnston
위의 의견에 동의합니다. 나는 이걸 정적으로 만들지는 않겠지 만, DayDAO (!) 인터페이스 뒤에 그 일을 넣어 둡니다. 그런 다음이 인스턴스를 UI에 전달합니다. 그것은 dayDAO.getDay (MEDIUM)을 호출하고 액세스 레이어가이를 처리합니다. 통계학 필요 없음. 그러면 다른 행동을 조롱하고 테스트하는 것이 훨씬 쉬워집니다. – mdma