Java 访问包私有变量的最佳实践是什么?

Java 访问包私有变量的最佳实践是什么?,java,accessor,package-private,Java,Accessor,Package Private,从同一个包中的其他类访问包私有变量的良好实践是什么 包专用访问器 String getColor() { return color; } 只是从对象访问字段 String color = instanceOfClass.color; 我认为: 用于访问包专用字段的包专用方法。很多不必要的代码,但在我看来,有很多字段(以及正确命名的访问器方法)提供了清晰性 对于包中的包私有变量,我们不需要访问器和变异器,所以也许我不应该创建它们 哪种做法更好,符合编程惯例 编辑:谢谢你的快速回答!

从同一个包中的其他类访问包私有变量的良好实践是什么

  • 包专用访问器

    String getColor() {
        return color;
    }
    
  • 只是从对象访问字段

    String color = instanceOfClass.color;
    
  • 我认为:

  • 用于访问包专用字段的包专用方法。很多不必要的代码,但在我看来,有很多字段(以及正确命名的访问器方法)提供了清晰性

  • 对于包中的包私有变量,我们不需要访问器和变异器,所以也许我不应该创建它们

  • 哪种做法更好,符合编程惯例


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

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

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

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

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

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

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

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

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

    即使是一些代码,也可以使用访问器/变异器:

    • 如果您以后在访问/设置变量时引入一些逻辑,您可以只在一个地方执行,而无需影响使用该变量的所有类-您可以轻松添加其他功能,如日志记录、延迟加载、安全性、验证等

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

    • 稍后您可以引入返回对象的生命周期管理—例如,返回池/缓存/单例/。。反对
    • 您可以稍后决定返回代理/修饰对象,而不影响调用者

    一般来说,这是一个好主意,因为它为您提供了更大的灵活性,保留了封装并减少了对象之间的耦合。

    具有访问器/变异器通常很方便,即使它是一些更多的代码:

    • 如果您以后在访问/设置变量时引入一些逻辑,您可以只在一个地方执行,而无需影响使用该变量的所有类-您可以轻松添加其他功能,如日志记录、延迟加载、安全性、验证等

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

    • 稍后您可以引入返回对象的生命周期管理—例如,返回池/缓存/单例/。。反对
    • 您可以稍后决定返回代理/修饰对象,而不影响调用者

    一般来说,这是一个好主意,因为它为您提供了更大的灵活性,保留了封装并减少了对象之间的耦合。

    最佳实践是使用getter和setter

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

    private String color = InstanceOfClass.color;
    
    String getColor(){
        if(background == White)
            return Black;
    
        else
            return White;
    
        }
    
    您可以在此处获得有关它们的详细信息:
    最佳实践是使用getter和setter

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

    private String color = InstanceOfClass.color;
    
    String getColor(){
        if(background == White)
            return Black;
    
        else
            return White;
    
        }
    
    您可以在此处获得有关它们的详细信息:

    它们是包私有的事实没有什么区别。做你想做的事。如果事物被声明为final并且是不可变的,那么我真的看不出getter方法有什么用途。我知道有人会不同意,我不同意。Getter方法更灵活,可以处理辅助逻辑,防止客户端发生更改,甚至可以在包中隐藏实现。我建议将变量
    设置为private
    并将访问器package-private设置为package-private。它们是package-private这一事实没有什么区别。做你想做的事。如果事物被声明为final并且是不可变的,那么我真的看不出getter方法有什么用途。我知道有人会不同意,我不同意。Getter方法更灵活,可以处理辅助逻辑,防止客户端发生更改,甚至可以在包中隐藏实现。我建议将变量
    设为private
    并将访问器包设为private。谢谢!:)看起来是我最好的答案,和答案有关。谢谢!:)正如你所说,你真的不在乎字段是如何设置的。你关心它的设置。您不需要一个可以封装无效状态的对象。关键是它是关于c的