gpt4 book ai didi

java - 如何在 Java 字段中设置基数?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:04:41 24 4
gpt4 key购买 nike

假设我们有以下类:

public class MyClass{
List<String> list;

void method() {
}
}

这个类的每个对象都有一个字符串列表,但是如果我们要设置基数呢?例如,我想强制这个类在该列表中有至少 2 个字符串。

是否有表示字段基数的通用模式?

最佳答案

您只需通过某种方式确保 list 中至少有 2 个元素。没有标准或简单的方法可以做到这一点。

这被称为类的不变量。作为编写类的人,您有责任确保始终保留此不变量。特别是:

  • 您需要记录列表中至少有 2 个元素的不变量。

  • 您需要确保 list 在构造函数完成时至少包含两个元素。当构造函数完成时,该实例应该是“有效的”(在其记录的不变量为真的意义上)。

  • 您需要确保类中的所有代码在操作列表时都遵守不变量 - 您可以暂时使其无效,但您必须确保不可能在无效中观察到您的实例状态。

    在单线程的情况下,这只是意味着一旦公共(public)方法返回,不变量必须为真(注意这包括发生异常的情况);但是,如果您的代码被设计为以多线程方式使用,您还必须确保没有线程可以在不变量为假的状态下看到您的实例(例如,您可能需要 synchronized block ,或者确保更新是原子的)。

  • 您需要确保您的类的子类无法使不变量为假;或明确记录,编写子类的人有责任确保不变量保持为真。

    Effective Java 2nd Ed 中有一篇关于此的重要文章:“为继承设计和记录,否则禁止继承”。

  • 您需要确保您的类之外的任何人都无法访问对列表的引用。例如,您的代码使列表对同一包中的其他类可见 - 这些类中的任何一个都可以调用 theInstance.list.clear(),并使您的不变量无效。

    要绝对防止这种情况非常困难 - 例如,恶意行为者可能会使用反射使不变量无效。您可以防止这种情况发生,但这是一个权衡识别和阻止此类方法的工作量与不变量变为假的实际成本的问题(这在很大程度上取决于此类的使用方式)。

到目前为止,实现不变量的最简单方法是在不可变类 上。如果无法更改实例的可观察状态,则无法使不变量无效。然后,您需要担心的是 a) 确保该类是不可变的; b) 确保构造函数返回后不变量为真。上面的所有其他要点都会消失。

关于java - 如何在 Java 字段中设置基数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40823102/

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