我正在实施一个网络应用程序,它具有一组相关的"类型"。即:
/** Universal type **/
INTEGER(0x0002),
BIT_STRING(0x0003),
OCTET_STRING(0x0004),
NULL(0x0005),
OBJECT_ID(0x0006),
SEQUENCE(0x0010),
/** Application specific **/
IP_ADDRESS(0x0040),
COUNTER32(0x0041),
GAUGE32(0x0042),
TIME_TICKS(0x0043),
OPAQUE(0x0044),
COUNTER64(0x0046),
UNSIGNED_INTEGER(0x0047);
<小时/> 在我的应用程序中,我必须为各种类型分配约束,以及从给定类型对它们进行编码/解码。有没有办法不必为每个人创建一个单独的类?
例如:Unsigned Integer
+ Gauge32
+ Counter32
都是long
类型。他们只是有不同的约束。整数可以是+- LONG.MAX
,Gauge只能是positive long values
,而计数器也只能是positive long values
。
是否有可以解释这些类型细节的设计模式?
答案 0 :(得分:0)
只需使用继承。例如:
abstract class BaseLong {
protected long value;
public void setValue(final long value) throws YourControlException {
if (checkValue(value)) {
this.value = value;
}
}
protected abstract void checkValue(final long value) throws YourControlException;
}
class UnsignedInteger extends BaseLong {
@Override
protected void checkValue(final long value) throws YourControlException {
// Check if the value is ok for UnsignedInteger and throw as appropriate
}
}
class Gauge32 extends BaseLong {
@Override
protected void checkValue(final long value) throws YourControlException {
// Check if the value is ok for Gauge32 and throw as appropriate
}
}
请注意,您可以使用现有的Exception
(例如UnsupportedOperationException
)代替YourControlException
。你也可以让方法返回true / false而不是抛出异常,但我个人更喜欢异常方式。
另请注意,Java中没有无符号值,因此UnsignedInteger
最多必须为32位。
在定义类之后,我还建议你创建一些工厂来创建这些对象,在这种情况下,为所有类型创建一个基类也很好,比如Type
,所以你有你的工厂只返回那种物体。
答案 1 :(得分:0)
我不确定您发布的代码本身是否反映了正确的设计。
然而,要回答你的问题,可以使用Java 8:
我怀疑你有一个枚举,即使你没有明确地表明它:
public enum Type {
/** Universal type **/
INTEGER(0x0002, l -> true),
BIT_STRING(0x0003, l -> true),
OCTET_STRING(0x0004, l -> true),
NULL(0x0005, l -> true),
OBJECT_ID(0x0006, l -> true),
SEQUENCE(0x0010, l -> true),
/** Application specific **/
IP_ADDRESS(0x0040, l -> true),
COUNTER32(0x0041, l -> true),
GAUGE32(0x0042, l -> true),
TIME_TICKS(0x0043, l -> true),
OPAQUE(0x0044, l -> true),
COUNTER64(0x0046, l -> true),
UNSIGNED_INTEGER(0x0047, l -> true);
private final int code;
private final LongPredicate predicate;
private Type(final int code, final LongPredicate predicate) {
this.code = code;
this.predicate = predicate;
}
public int getCode() {
return code;
}
public boolean test(final long input) {
return predicate.test(input);
}
}
在这里,您可以为约束指定特定谓词,例如,对于您具有的正长度:
l -> (l > 0);
将l
映射到l > 0
。然后,这些LongPredicate
也可以private static
,以便您可以引用一个具体实例。
通过致电long input
,您可以在确定某个Type
后查看Type.test(input);
。