【问题标题】:Would it be bad practice to have public Java class members in this case?在这种情况下,拥有公共 Java 类成员会是不好的做法吗?
【发布时间】:2012-10-24 04:15:56
【问题描述】:

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

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,但我不确定。在这种情况下看起来很复杂。

提前致谢。

【问题讨论】:

  • 我认为这应该在 CodeReview 中。

标签: java private public


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

    最后,从一个简单的公共字段开始是没有问题的。一旦找到更合适的解决方案,您可以随时对其进行重构。

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

    【讨论】:

    • 谢谢!那很有帮助。它将是私人的。
    • 周到的回答。我只说一句。即使“您以后总是可以重构它”对于 OP 来说可能是正确的,但在其他情况下并非如此。如果您正在交付其他人使用的代码(即框架或“API”),那么一旦该字段被公开,它将被原样使用,并且在不破坏向后兼容性的情况下无法隐藏。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

          • 我不认为仅仅拥有 getter&setter 就比公共领域好得多 - 它归结为同样的事情。唯一的例外是公共 API,它可能是值得的。否则,如果您想完全访问某个字段,只需将其公开即可。如果您以后需要更改它,只需重构 using 类以及此类。
          猜你喜欢
          • 1970-01-01
          • 2017-03-31
          • 2014-11-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多