자바 스크립트와 같이 느슨한 형식의 객체로 동작하는 클래스 (또는 동일한 인터페이스를 구현하는 클래스 세트)를 정의하려고합니다. 그들은 모든 종류의 데이터와 연산을 기본 유형에 따라 다룰 수 있습니다.런타임시 형식 확인을위한 Java 베스트 프랙티스
세 가지 다른 방식으로 작동하지만 이상적인 것은 없습니다. 이 테스트 버전은 문자열과 정수 만 허용하며 유일한 연산은 add입니다. 정수를 추가하면 정수 값의 합계가 생기고 문자열을 추가하면 문자열이 연결되고 문자열에 정수를 추가하면 정수가 문자열로 변환되어 문자열과 연결됩니다. 최종 버전에는 더 많은 유형 (Doubles, Arrays, 새 속성을 동적으로 추가 할 수있는 JavaScript와 유사한 객체) 및 더 많은 작업이 포함됩니다.
방법 1 : DynString1
에 대한public interface DynObject1 {
@Override public String toString();
public DynObject1 add(DynObject1 d);
public DynObject1 addTo(DynInteger1 d);
public DynObject1 addTo(DynString1 d);
}
public class DynInteger1 implements DynObject1 {
private int value;
public DynInteger1(int v) {
value = v;
}
@Override
public String toString() {
return Integer.toString(value);
}
public DynObject1 add(DynObject1 d) {
return d.addTo(this);
}
public DynObject1 addTo(DynInteger1 d) {
return new DynInteger1(d.value + value);
}
public DynObject1 addTo(DynString1 d)
{
return new DynString1(d.toString()+Integer.toString(value));
}
}
... 및 이와 유사한
방법 2 : 공용 인터페이스의 DynObject2 { @Override 공공 문자열 toString(); public DynObject2 add (DynObject2 d); } DynString2
에 대한public class DynInteger2 implements DynObject2 {
private int value;
public DynInteger2(int v) {
value = v;
}
@Override
public String toString() {
return Integer.toString(value);
}
public DynObject2 add(DynObject2 d) {
Class c = d.getClass();
if(c==DynInteger2.class)
{
return new DynInteger2(value + ((DynInteger2)d).value);
}
else
{
return new DynString2(toString() + d.toString());
}
}
}
... 및 이와 유사한
방법 3 : 대신 내가 value.getClass()를 사용 == 수 있다면 - 다른 논리 Integer.class와
public class DynObject3 {
private enum ObjectType {
Integer,
String
};
Object value;
ObjectType type;
public DynObject3(Integer v) {
value = v;
type = ObjectType.Integer;
}
public DynObject3(String v) {
value = v;
type = ObjectType.String;
}
@Override
public String toString() {
return value.toString();
}
public DynObject3 add(DynObject3 d)
{
if(type==ObjectType.Integer && d.type==ObjectType.Integer)
{
return new DynObject3(Integer.valueOf(((Integer)value).intValue()+((Integer)value).intValue()));
}
else
{
return new DynObject3(value.toString()+d.value.toString());
}
}
}
형식을 저장하지만 더 많은 형식으로 스위치 문을 사용하도록 변경하고 Java에서 클래스가 클래스를 사용하도록 허용하지 않습니다.
어쨌든 ... 내 질문은이게 뭐가 있는지에 대한 가장 좋은 방법은 무엇입니까?
덧붙여 말하자면, Java 지식이 나를 망각시키지 않으면,'Class c = d.getClass(); if (c == DynInteger2.class)'는'if (d instanceof DynInteger2)'로 쓸 수 있습니다. – Thomas