将私有 class 变量设为 public 是否有任何目的
Is there any purpose to make private class variable to public
您好,我很想知道在 Java.
中将私有 class 变量设为 public 有什么目的吗
public class XYZ {
public String ID;
public ABC abc;
private class ABC {
public boolean isExist;
}
}
提前致谢。
是的,这是有目的的。如果您这样做,那么那些可以访问 class 的程序元素可以直接操作该变量。否则(假设变量是私有的),这些元素仍然能够访问 class 但无法操作变量(除非您为其提供 getter/setter)。
这样想:class 修饰符定义了对 class 的访问级别,然后变量修饰符定义了对变量本身的访问级别(对于那些可以访问 class)。
也就是让isExist
对XYZ可见class。
请注意,ABC 仅对 XYZ 可见,对任何外部 classes 不可见,并且其变量为 public,因此您可以访问它。 private
对 XYZ 没有意义,仅在 classes
之外
从 XYZ 内部,
ABC abc = new ABC(); //can only be accessed by XYZ.
abc.isExists = true; //can only be accessed by XYZ
制作 isExist
public 意味着您不关心封装(防止它被外部不必要的操作)。如果将其设为私有,则需要 get
访问器来公开它
private class ABC {
private boolean _isExist; //only through accessors
public boolean isExist()
{
return _isExist;
}
}
有时仅对数据进行此操作 类。例如,有时这样做是为了表示存储在数据库中的模型(请参阅 Objectify 以了解如何结合注释来表示存储在 App Engine 数据库中的数据库模型的真实示例) .
话虽这么说,但这种事情非常糟糕 API。如果您这样做,我建议仅使用 类 进行包级访问或私有嵌套 类。当将功能或数据暴露给包外的代码时,通常最好使用精心设计的接口来实现,如果您的底层结构发生变化,您可以更改实现。
您可以对 class 实例变量执行以下两项操作之一:
事情#1:保持你的实例变量私有。然后使用 public getter 和 setter 方法来获取和设置该变量的值。这样做的好处是您可以在 setter 方法中进行检查。例如,长度永远不能为负数。因此,您不能只设置长度 public 并让任何人为其分配他们想要的任何值。您需要确保分配给它的值不是负数。所以:
class myClass {
private int length;
public void setLength(int i) {
if ( i > 0 ) {
length = i;
}
}
}
此外,您可以将实例变量设置为只读、只写或读写,具体取决于该私有变量的 getter 和 setter 方法的可用性。
事情#2:如果您不需要对实例变量的值进行任何限制,并且您希望它既不是只读的也不是只写的,那么保留该变量就可以了 public.例如:婴儿可以有任何名字 - 没有限制:
class Baby {
public name;
}
class Mother {
public void nameTheBaby() {
Baby baby = new Baby();
baby.name = "Sarah";
}
}
您好,我很想知道在 Java.
中将私有 class 变量设为 public 有什么目的吗public class XYZ {
public String ID;
public ABC abc;
private class ABC {
public boolean isExist;
}
}
提前致谢。
是的,这是有目的的。如果您这样做,那么那些可以访问 class 的程序元素可以直接操作该变量。否则(假设变量是私有的),这些元素仍然能够访问 class 但无法操作变量(除非您为其提供 getter/setter)。
这样想:class 修饰符定义了对 class 的访问级别,然后变量修饰符定义了对变量本身的访问级别(对于那些可以访问 class)。
也就是让isExist
对XYZ可见class。
请注意,ABC 仅对 XYZ 可见,对任何外部 classes 不可见,并且其变量为 public,因此您可以访问它。 private
对 XYZ 没有意义,仅在 classes
从 XYZ 内部,
ABC abc = new ABC(); //can only be accessed by XYZ.
abc.isExists = true; //can only be accessed by XYZ
制作 isExist
public 意味着您不关心封装(防止它被外部不必要的操作)。如果将其设为私有,则需要 get
访问器来公开它
private class ABC {
private boolean _isExist; //only through accessors
public boolean isExist()
{
return _isExist;
}
}
有时仅对数据进行此操作 类。例如,有时这样做是为了表示存储在数据库中的模型(请参阅 Objectify 以了解如何结合注释来表示存储在 App Engine 数据库中的数据库模型的真实示例) .
话虽这么说,但这种事情非常糟糕 API。如果您这样做,我建议仅使用 类 进行包级访问或私有嵌套 类。当将功能或数据暴露给包外的代码时,通常最好使用精心设计的接口来实现,如果您的底层结构发生变化,您可以更改实现。
您可以对 class 实例变量执行以下两项操作之一:
事情#1:保持你的实例变量私有。然后使用 public getter 和 setter 方法来获取和设置该变量的值。这样做的好处是您可以在 setter 方法中进行检查。例如,长度永远不能为负数。因此,您不能只设置长度 public 并让任何人为其分配他们想要的任何值。您需要确保分配给它的值不是负数。所以:
class myClass {
private int length;
public void setLength(int i) {
if ( i > 0 ) {
length = i;
}
}
}
此外,您可以将实例变量设置为只读、只写或读写,具体取决于该私有变量的 getter 和 setter 方法的可用性。
事情#2:如果您不需要对实例变量的值进行任何限制,并且您希望它既不是只读的也不是只写的,那么保留该变量就可以了 public.例如:婴儿可以有任何名字 - 没有限制:
class Baby {
public name;
}
class Mother {
public void nameTheBaby() {
Baby baby = new Baby();
baby.name = "Sarah";
}
}