5

我正在编写一个通信软件,它将与我大学控制部门的实验室流程进行通信。这些进程通过串行端口进行通信,并且会有相当多的位检查/操作。我写了一个如下的辅助类:

public class Channel {

    public enum Kind {DIGITAL_IN, DIGITAL_OUT, ANALOG_IN, ANALOG_OUT, COUNTER_IN};

    private int resolution;
    private int number;
    private Kind kind;
    public byte[] bits;

    public Channel(Kind kind, int resolution, int number) throws Exception {
        if (resolution % 8 != 0) {
            throw new Exception("Resolution must be divisible by 8");
        }
        this.kind = kind;
        this.resolution = resolution;
        this.number = number;
        this.bits = new byte[resolution/8];
    }


    public int getResolution() {
        return resolution;
    }

    public int getNumber() {
        return number;
    }

    public Kind getKind() {
        return kind;
    }
}

我现在的问题是,在这种情况下,将我的 byte[] 声明为 public 是否被认为是不好的做法?在我的 LabProcessProtocol 类中,我将访问这些通道位并根据我从串行端口上的进程中获得的内容更改它们。

我有一种预感,Java 就是私有的,使用 getter 和 setter,但我不确定。在这种情况下,它似乎很复杂。

提前致谢。

4

6 回答 6

9

好吧,没有绝对禁止公共领域。如果您认为这是最好的解决方案,请不要感到羞耻,继续做吧。

也就是说,停下来想想你想完成什么。将所有内容都私有化本身并不是一个目标——这个想法是建立不变量,使代码更易于理解和使用。

所以考虑一下你想用它做byte[]什么——其他人想对它执行什么操作?考虑为这些操作提供方法,这将比公开该领域更容易理解和清洁。另外,请考虑您不想允许的操作这将是建立不变量的部分)。例如,直接字段访问将允许用byte[] 另一个不同长度的替换 - 您可能希望阻止这种情况。

或者可能发生了太多事情byte[]以至于它应该拥有一个自己的(包装)类?这一切都取决于它是如何使用的。

最后,从一个简单的公共领域开始是没有问题的。一旦找到更合适的解决方案,您总是可以稍后重构它。

注意: “您以后可以随时重构它”不适用于作为公共 API 一部分的类(即您正在编写一个库以供其他外部项目使用)。公共 API 的设计(通常称为“API 设计”)比“内部”代码的设计要困难得多,这只是一个例子。这可能不适用于这种情况,我只是想指出这一点。

于 2012-11-03T20:46:19.487 回答
3

通常,建议将byte[]字段保留为private并实现从类外部操作字段的方法。将字段声明为(至少恕我直言)并不是一种糟糕的做法,但是当您继续开发/更新项目时,离开它可以避免以后出现问题。我认为很好地描述了我的意思。publicprivate

于 2012-11-03T20:42:53.867 回答
3

将其设为私有,但不要只使用 getter 和 setter —— 用户应该如何访问您的bits数组?他们总是得到第一个元素,还是总是循环通过它?(ByteBuffer可能在这里给您一些有用的想法,或者您应该直接使用ByteBuffer。)提供以您希望用户使用它的方式访问它的方法;不要只提供 getter 和 setter。

于 2012-11-03T20:52:16.853 回答
2

我会公开bits[]通过访问器(getter/setter)。通过访问器公开数组,您至少可以将对数组的访问汇集到特定方法。如果您将来需要进行更改,您将不会有一堆依赖于直接访问该字段的代码,这为您提供了更多的灵活性。

于 2012-11-03T20:42:43.477 回答
0

我关心的是从 API 中分离实现。如果您希望在将来对类的内部进行更改时,使用API 的Channel其他代码仍然可以在不修改的情况下工作,那么您将使用 getter 和 setter 并使用字段。在其他情况下,您可以使用字段。但是,请注意,在这些情况下,即使字段的名称和类型也是实现细节。在我看来,内部字段的名称和类型不应影响其他类。Channelprivatepublicbits

于 2012-11-03T20:50:55.267 回答
0

通过将字段设为私有并使用访问器和修饰符方法,您将遵循封装规则,该规则可防止字段意外更改,从而开发更容错的应用程序。

于 2016-02-28T11:46:56.210 回答