有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

契约式设计如何在Java中实现自定义类实例不变量

在Java中,执行类实例不变量(即确保在调用任何公共方法之前和之后某些语句都是真的)的最佳方法是什么

我将在下面举一个例子(这个例子让我对这个问题感到好奇),但事实上,我更感兴趣的是一个施加类实例不变量的通用解决方案

假设我有以下课程:

public class Constraint
{
  private int cardinality;

  // constructor and getter/setter omitted
}

public class Edge
{
  private int minCardinality = 1;
  private int maxCardinality = Integer.MAX_VALUE;
  private Constraint constraint = null;

  // constructors, getters/setters and other methods omitted
}

我想在Edge类上强制执行以下语句:

  • 0<;=minCardinality<;=最大基数
  • 如果(constraint!=null),那么(minCardinality<;=constraint.getCardinality()<;=最大基数)

这里,边缘实例是由一个解析器创建的,该解析器具有(必需的)属性minCardinality和maxCardinality set。(可选)约束属性保留为空。然后将实例移交给另一个模块(测试帧生成器),该模块可以通过setter方法设置约束,也可以不设置约束


共 (1) 个答案

  1. # 1 楼答案

    使用一个建设者,把支票放进去;这样Edge类就不在乎了:

    @Immutable // See JSR 305
    public final class Edge
    {
        private final int minCardinality;
        // ...
    
        public static Builder newBuilder() { return new Builder(); }
    
        // Edge has no public constructor anymore, only this one:
        private Edge(final Builder builder)
        {
            minCardinality = builder.minCardinality;
            // etc
        }
    
        @NotThreadSafe // See JSR 305
        public static final class Builder
        {
            private int minCardinality;
            // ...
    
            private Builder() {}
    
            public Builder withMinCardinality(final int minCardinality)
            {
                this.minCardinality = minCardinality;
                return this;
            }
            // etc
    
            public Edge build()
            {
                // checks here
                return new Edge(this);
            }
        }
    }
    

    用法:

    final Edge edge = Edge.newBuilder().withMinCardinality(xxx).etc().etc().build();