将私有 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";
    }
}