访问包私有变量的好习惯是什么?
What is good practice to accessing package private variables?
从同一个包中的其他 类 访问我的包私有变量有什么好的做法?
包-私有访问器
String getColor() {
return color;
}
只是从对象访问作为字段。
String color = instanceOfClass.color;
我认为:
用于访问包私有字段的包私有方法。很多不必要的代码,但在我看来提供了很多字段的清晰度(以及正确命名的访问器方法)
我们不需要包中包私有变量的访问器和修改器,所以也许我不应该创建它们?
哪种做法更好,符合编程约定?
编辑:感谢您的快速回答! :)
与封装相比,访问器和修改器与抽象的关系更大。您希望能够控制 如何 设置该字段,而不是让任何人在其中放置一些随机值。例如,您可能有一个永远不应为 null 的值,因此..
void setField(Field field) {
if(field != null) {
this.field = field;
}
}
然后您将 field
变量声明为 private
。如果你允许任何人向其中写入任何内容,那么这个逻辑将需要移动到设置它的任何地方,这将导致代码重复。
仅在必要时使用访问器。除此之外,最好只允许在该包内部访问包私有变量。例如,如果变量是计算中使用的某个值,请使用来自另一个包的 public 方法调用在包 中 执行您需要的操作,然后传递它到您的其他包裹。
拥有 accessors/mutators 通常很方便,即使它需要更多代码:
如果你稍后在 accessing/setting 变量时引入一些逻辑,你可以只在一个地方做,而不需要影响所有使用变量的 类 - 你可以轻松添加功能,如附加日志记录、延迟加载、安全性、验证...
您可以稍后更改字段的基础表示(例如,在某些情况下 return 子类型)
- 您稍后可以引入 returned 对象的生命周期管理 - 例如。 Return pooled/cached/singleton/.. 对象
- 您稍后可以决定 return Proxy/decorated 对象而不影响调用者
总的来说,这是一个好主意,因为它可以为您提供更大的灵活性、保留封装并减少对象之间的耦合。
最佳做法是使用 Getters 和 Setters。
这允许以后更容易地添加附加功能(如验证),并防止您授予从其他 class.
直接访问这些变量的特权
private String color = InstanceOfClass.color;
String getColor(){
if(background == White)
return Black;
else
return White;
}
您可以在这里获得有关它们的详细信息:
Getter Setter: To Use or Not to Use
从同一个包中的其他 类 访问我的包私有变量有什么好的做法?
包-私有访问器
String getColor() { return color; }
只是从对象访问作为字段。
String color = instanceOfClass.color;
我认为:
用于访问包私有字段的包私有方法。很多不必要的代码,但在我看来提供了很多字段的清晰度(以及正确命名的访问器方法)
我们不需要包中包私有变量的访问器和修改器,所以也许我不应该创建它们?
哪种做法更好,符合编程约定?
编辑:感谢您的快速回答! :)
与封装相比,访问器和修改器与抽象的关系更大。您希望能够控制 如何 设置该字段,而不是让任何人在其中放置一些随机值。例如,您可能有一个永远不应为 null 的值,因此..
void setField(Field field) {
if(field != null) {
this.field = field;
}
}
然后您将 field
变量声明为 private
。如果你允许任何人向其中写入任何内容,那么这个逻辑将需要移动到设置它的任何地方,这将导致代码重复。
仅在必要时使用访问器。除此之外,最好只允许在该包内部访问包私有变量。例如,如果变量是计算中使用的某个值,请使用来自另一个包的 public 方法调用在包 中 执行您需要的操作,然后传递它到您的其他包裹。
拥有 accessors/mutators 通常很方便,即使它需要更多代码:
如果你稍后在 accessing/setting 变量时引入一些逻辑,你可以只在一个地方做,而不需要影响所有使用变量的 类 - 你可以轻松添加功能,如附加日志记录、延迟加载、安全性、验证...
您可以稍后更改字段的基础表示(例如,在某些情况下 return 子类型)
- 您稍后可以引入 returned 对象的生命周期管理 - 例如。 Return pooled/cached/singleton/.. 对象
- 您稍后可以决定 return Proxy/decorated 对象而不影响调用者
总的来说,这是一个好主意,因为它可以为您提供更大的灵活性、保留封装并减少对象之间的耦合。
最佳做法是使用 Getters 和 Setters。
这允许以后更容易地添加附加功能(如验证),并防止您授予从其他 class.
直接访问这些变量的特权private String color = InstanceOfClass.color;
String getColor(){
if(background == White)
return Black;
else
return White;
}
您可以在这里获得有关它们的详细信息: Getter Setter: To Use or Not to Use