访问包私有变量的好方法是什么?

时间:2017-06-20 18:45:46

标签: java accessor package-private

从同一个包中的其他类访问我的包私有变量有什么好的做法?

  1. 包私有访问者

    String getColor() {
        return color;
    }
    
  2. 只需从对象访问字段。

    String color = instanceOfClass.color;
    
  3. 在我看来:

    1. 用于访问package-private字段的Package-private方法。很多不必要的代码,但在我看来提供了许多字段(以及正确命名的访问方法)的清晰度

    2. 我们不需要包中的包私有变量的访问器和变换器,所以也许我不应该创建它们?

    3. 哪种做法更好,与编程惯例一致?

      编辑:谢谢你快速回答! :)

4 个答案:

答案 0 :(得分:2)

访问器和增变器与抽象有关,而不是封装。您希望能够控制 该字段的设置方式,而不是让任何人在其中放置一些随机值。例如,您可能有一个永远不应为null的值,所以..

void setField(Field field) {
    if(field != null) {
        this.field = field;
    }
}

然后,您会将field变量声明为private。如果您允许任何人在其中写入任何内容,则需要将此逻辑移动到设置它的任何位置,这将导致代码重复。

答案 1 :(得分:0)

仅在必要时使用访问者。除此之外,最好只允许在该包内访问包私有变量。例如,如果变量是计算中使用的某个值,则使用来自另一个包的公共方法调用,使用在包中执行所需的操作,然后将其传递给另一个包。

答案 2 :(得分:0)

即使有更多的代码,有访问器/ mutator通常也很方便:

  • 如果您稍后在访问/设置变量时引入了一些逻辑,则可以在一个地方完成,而无需使用变量影响所有类 - 您可以轻松添加功能作为额外的日志记录,延迟加载,安全,验证,......

  • 您可以稍后更改字段的基础表示(例如,在某些情况下返回子类型)

  • 您可以稍后介绍返回对象的生命周期管理 - 例如。返回pooled / cached / singleton / ..对象
  • 您可以稍后决定返回代理/装饰对象而不影响来电者

通常,这是一个好主意,因为它可以提供更大的灵活性,保留封装并减少对​​象之间的耦合。

答案 3 :(得分:0)

最佳做法是使用Getters and Setters。

这允许以后更容易添加其他功能(如验证)并阻止您从其他类直接访问这些变量的特权。

private buildWildcardList(path:string): string[] {
        let result: string[] = [];
        _.each(this.acceptedFileExtensions, (extension: string) => {
           result.push(path + '/**/*' + extension);
        });

       return result;
    }

let wildcardList: string[] = this.buildWildcardList(path);
this.watcher = chokidar.watch(wildcardList, watchOptions);

您可以在此处获得有关他们的良好信息: Getter Setter: To Use or Not to Use