设计实施

时间:2014-03-14 20:48:42

标签: java algorithm

我正在实施一个网络应用程序,它具有一组相关的"类型"。即:

    /** 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

是否有可以解释这些类型细节的设计模式?

2 个答案:

答案 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);