gpt4 book ai didi

java - 如何在 Java 中强制执行自定义类实例不变量

转载 作者:行者123 更新时间:2023-11-29 03:32:59 25 4
gpt4 key购买 nike

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

我将在下面包括一个例子(那个让我对这个问题感到疑惑的例子),但实际上我对强加类实例不变量的通用解决方案更感兴趣。

假设我有以下类(class):

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 <= 最小基数 <= 最大基数
  • if (constraint != null) then (minCardinality <= constraint.getCardinality() <= maxCardinality)

这里的 Edge 实例是由具有(强制性)属性 minCardinality 和 maxCardinality 集的解析器创建的。 (可选)约束属性留空。然后将实例移交给另一个模块(测试框架生成器),该模块可能会或可能不会通过 setter 方法设置约束。

最佳答案

使用构建器并将支票放入其中;这样你的 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();

关于java - 如何在 Java 中强制执行自定义类实例不变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17104408/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com