2012-11-03 19 views
5

我正在写一个通信软件,它将与我单位的控制部门的实验室流程进行交流。这些进程通过串口进行通信,并且会有一点点的检查/操作。我写了一个辅助类,类似如下:在这种情况下拥有公共Java类成员是不好的做法吗?

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; 
    } 
} 

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

我有一个预感,Java是关于私人和使用getters和setters,但我不知道。在这种情况下似乎很复杂。

在此先感谢。

+0

我认为这应该在CodeReview中。 – poitroae

回答

8

那么,对公共领域没有绝对的禁止。如果你觉得这是最好的解决方案,那么不要感到羞耻,那就去做吧。

这就是说,停下来想想你想完成什么。把所有东西都私有化本身并不是一个目标 - 这个想法是建立不变式,使代码更易于理解和使用。

因此,考虑你想要做什么与byte[] - 其他人想要执行什么操作?考虑有这些操作的方法,这将比将该领域公开为更容易理解和更清洁。另外,考虑你要做什么操作而不是想要允许(这将是建立不变量的部分)。例如,直接字段访问将允许用另一个不同长度的文件替换byte[] - 您可能想要阻止该文件。

或许这么多发生在这byte[]它值得它自己的(包装)类?这完全取决于它是如何使用的。

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

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

+0

谢谢!这很有帮助。它将是私人的。 – evading

+0

周到的答案。我只有一句话。即使“你以后总是可以重构它”对于OP来说可能是正确的,但在其他情况下也是如此。如果您提供的是其他人使用的代码(即框架或“API”),那么一旦该字段已经公开,它将被用作此类,并且在不破坏向后兼容性的情况下不能被隐藏。 –

+0

@AdriaanKoster:是的,好点。我将它添加到我的答案中。 – sleske

2

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

+3

我不认为只有吸气剂和固化剂明显优于公共领域 - 它归结为同样的事情。唯一的例外是公共API,它可能是值得的。否则,如果您想要完全访问某个字段,请将其公开。如果您以后需要更改它,只需重新使用这个类就可以了。 – sleske

3

通常建议将byte[]字段保留为private,并实现方法从类外部操作字段。这并不是说它是可怕的练习宣布该字段为public(至少imho),但如果您继续开发/更新项目,则可以在以后避免问题。我认为this描述我的意思很好。

0

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

3

让它变得私密,但不要只使用getter和setter - 用户应该如何访问您的bits阵列?他们总是获得第一个元素,还是总是通过它循环? (ByteBuffer可能会在这里给你一些有用的想法,或者你应该直接使用ByteBuffer)。提供方法以你打算用户使用它的方式访问它;不要只提供getter和setter。

0

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

相关问题