gpt4 book ai didi

java - 限制公共(public)可访问成员 - 解决方法

转载 作者:行者123 更新时间:2023-11-30 04:28:58 29 4
gpt4 key购买 nike

我想在逻辑部分“数据”、“命令”和“引擎”中打破我的应用程序模型。应用程序外部的每个人都应该获得对数据的只读访问权限和对命令的访问权限。通过这些命令,他们可以操纵数据。

我已经在包中构建了我的应用程序:

myapp.model.data
myapp.model.commands
myapp.model.engines

引擎和命令都需要对数据进行写访问。因此,我必须以公共(public)接口(interface)的形式公开写访问权限。这导致了外部客户端也对我的数据具有写访问权限的问题,这是不允许的。这样做的问题是,命令通过事件调用引擎来检查数据的一致性。客户端会在不调用引擎的情况下操作数据,从而破坏数据的一致性。

这个问题有没有通用的做法。请不要建议我必须等到 Java 8,因为我现在就想编写我的应用程序。将所有类放入一个包中也不是一种选择,因为我会失去应用程序的概述。

编辑

我浏览了一些有关树和图的不变性的网站。我看到了一个叫 zipper 的好主意:http://scienceblogs.com/goodmath/2010/01/13/zippers-making-functional-upda/ 。不幸的是,这似乎不适用于我的情况。

回想一下,我有一个复杂的对象图结构,它将随着时间的推移而被操纵。目标是限制客户端只能使用我的命令来操作数据。因此,在我的案例中,我没有看到不变性的优势。

为此,我为数据类提供了两个公共(public)接口(interface),一个是只读的,一个是可写的。每当客户端调用带有只读实例的命令时,我只需将其转换为可写实例。这种方法解决了我的问题,但有两个很大的缺点。首先,我假设每个只读实例同时都是可写实例 - 这可能会导致一些丑陋的错误。其次,客户端可以执行相同的操作并具有写访问权限。但我可以说这是他们自己的错。

有人有更好的主意吗?

最佳答案

针对此类问题,我采用了三种模式。按照我尝试的大致顺序:

1) 保持不变/无副作用。这是函数式编程语言强烈推荐的技术,java.lang.String 就是一个例子。这里单个实例是不可变的,并且调用 mutate 创建一个新实例。可能不适用于您设计命令和引擎的接口(interface)的方式,但如果您有精力重新设计它们的接口(interface),那么这是一种非常强大的方法,往往会减少行数。

2) 可锁定对象模式。对象在首次创建时是可变的,但在共享之前会被“锁定”。被锁定后,任何对变异方法的调用都会出错。解锁对象涉及创建该对象的新副本。

3) 为可变实例创建只读包装器。这使您可以控制谁可以变异,谁只能读取。 java.util.Collections#unmodifyingList(List list) 是来自 Java 运行时的此装饰器样式模式的示例,该模式将 setter 方法保留在共享接口(interface)上。人们可以使用一种完全没有 setter 方法的不同接口(interface)。

我的偏好始终是 1,因为它会导致代码更简单,更容易扩展。但是,如果我在这方面遇到困难,那么我倾向于退回到 2,因为它在方法之间提供了平衡,并且不允许另一个线程改变另一个线程后面的实例的可能性。它也不需要那么多额外的代码,但确实需要纪律来确保正确锁定对象并强制执行锁定语义。因此,这在实践中并不是一种很常见的模式。

关于java - 限制公共(public)可访问成员 - 解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15108641/

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