在这种情况下拥有公共Java类成员是不好的做法?

时间:2012-11-03 20:38:24

标签: java private public

我正在编写一个通讯软件,它将与我所在的控制部门的实验室流程进行对话。进程通过串口进行通信,并且会有一些比特检查/操作。我写了一个如下的助手类:

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 []声明为公开会被视为不良做法吗? 在我的LabProcessProtocol类中,我将访问这些通道位,并根据我从串行端口上的进程获得的内容进行更改。

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

提前致谢。

6 个答案:

答案 0 :(得分:9)

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

那就是说,停下来思考你想要完​​成的事情。将所有内容设为私有本身并不是目标 - 我们的想法是建立不变量,使代码更易于理解和使用。

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

或许这个byte[]可能会发生这样的事情,它应该得到一个自己的(包装)类吗?这一切都取决于它的使用方式。

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:3)

将其设为私有,但不要只使用getter和setter - 用户应该如何访问bits数组?他们总是得到第一个元素,还是他们总是骑自行车? (ByteBuffer可能会在这里给你一些有用的想法,或者你应该直接使用ByteBuffer。)提供以你打算用户使用它的方式访问它的方法;不只是提供吸气剂和制定者。

答案 3 :(得分:2)

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

答案 4 :(得分:0)

我关心将实现与API分离。如果您希望以后将某些内容更改为Channel类的内部,而其他使用Channel API的代码仍然无需修改即可使用,那么您将使用getter和setter并使用private字段。在其他情况下,您可以使用public字段。但请注意,在这些情况下,即使bits字段的名称和类型也是实现细节。在我看来,内部字段的名称和类型不应该影响其他类。

答案 5 :(得分:0)

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