Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Java中的属性可以是公共的?_Java_Oop_Visibility - Fatal编程技术网

为什么Java中的属性可以是公共的?

为什么Java中的属性可以是公共的?,java,oop,visibility,Java,Oop,Visibility,众所周知,Java遵循面向对象的范例,其中数据封装表示,对象的字段(属性)应该对外部世界隐藏,并且只能通过方法访问,或者方法是类对外部世界的唯一接口。那么,为什么可以在Java中将字段声明为公共字段,这将违反数据封装范式呢?以提高灵活性。如果我不能写作,那将是巨大的痛苦: class Point { public int x; public int y; } 在getter和setter后面隐藏这一点没有什么好处。我认为这是可能的,因为每个规则都有例外,在某些情况下,每个最佳实

众所周知,Java遵循面向对象的范例,其中数据封装表示,对象的字段(属性)应该对外部世界隐藏,并且只能通过方法访问,或者方法是类对外部世界的唯一接口。那么,为什么可以在Java中将字段声明为公共字段,这将违反数据封装范式呢?

以提高灵活性。如果我不能写作,那将是巨大的痛苦:

class Point {
    public int x;
    public int y;
}

在getter和setter后面隐藏这一点没有什么好处。

我认为这是可能的,因为每个规则都有例外,在某些情况下,每个最佳实践都可以被覆盖

例如,我经常将公共静态最终数据成员公开为公共(例如常量)。我不认为这是有害的

我将指出,除了java语言之外,这种情况在C++语言中也是正确的。


语言不一定总是保护我们不受自己的伤害

在奥利的例子中,我这样写有什么害处

public class Point {
   public final int x;
   public final int y;

   public Point(int p, int q) {
      this.x = p;
      this.y = q;
   } 
}
它是不可变的,线程安全的。数据成员可能是公共的,但您不能伤害他们

此外,“private”在Java中并不是真正的私有,这是一个肮脏的小秘密。你总是可以用反射来绕开它

所以放松点。还不错。

因为严格的“数据封装”并不是唯一的范例,也不是面向对象的强制性特征


而且,更重要的是,如果一个数据属性有一个公共setter方法和一个公共getter方法,并且这些方法除了实际设置/获取属性之外什么都不做,那么保持它私有的意义是什么呢?

不是所有的类都遵循封装范式(例如工厂类)。对我来说,这增加了灵活性。无论如何,程序员的责任不是语言,而是适当地确定范围。

讨论公共变量的好的一面。。。喜欢…:)

使用
public
变量有很多原因。让我们逐一检查:

演出

虽然很少见,但在某些情况下它很重要。在某些情况下,必须避免方法调用的开销

常数

我们可以对常量使用公共变量,在构造函数中初始化后,这些常量不能更改。这也有助于提高性能。有时这些可能是静态常量,如数据库的连接字符串。比如说,

public static final String ACCEPTABLE_PUBLIC = "Acceptable public variable";
其他情况


在某些情况下,
public
没有区别,或者不需要getter和setter。关于
的一个好例子已经作为答案写了出来

面向对象设计不需要封装。这是像Java这样的语言的最佳实践,它与语言设计的关系远大于OO

出于一个简单的原因,总是用Java封装只是一种最佳实践。如果不进行封装,则以后在不更改对象签名的情况下无法进行封装。例如,如果您的员工有一个姓名,并且您将其公开,那么它就是employee.name。如果以后要封装它,那么最终将得到employee.getName()和employee.setName()。这当然会破坏使用Employee类的任何代码。因此,在Java中,封装所有内容是最佳实践,这样您就不必更改对象的签名


其他一些OO语言(ActionScript3、C#等)支持true属性,其中添加getter/setter不会影响签名。在这种情况下,如果您有一个getter或setter,它将用相同的签名替换公共属性,因此您可以轻松地来回切换,而不会破坏代码。在这些语言中,总是封装的实践不再是必要的。

Java是C风格语法语言的一个分支。这些语言支持
struct
s,它们是通常被认为是“一项”的内存块的固定偏移别名。换句话说,数据结构是用
struct
s实现的

虽然使用结构直接违反了面向对象编程的封装目标,但当Java首次发布时,大多数人在迭代(过程)编程方面的能力要强得多。通过将成员公开为
public
,您可以像使用C
struct
一样有效地使用Java类,即使这两个环境的底层实现截然不同


有些情况下,您甚至可以通过适当的封装来实现这一点。例如,许多数据结构由两个或多个指针的节点组成,一个指向“包含的”数据,一个或多个指向数据结构其余部分的“其他”连接。在这种情况下,您可能会创建一个私有类,该类在“数据结构”类(如内部类)之外不可见,并且由于遍历该结构的所有代码都包含在相同的
.java
文件中,因此您可以删除
.getNext()
将内部类的方法作为性能优化。

我认为数据封装更像是一个附加功能,而不是强制性要求或规则,因此编码人员可以自由地使用其智慧应用这些功能并根据需要调整它们。因此,它是灵活的


一个相关的例子可以是@Oli Charlesworth给出的,我只是一个初学者,但如果不存在公开声明,java开发将非常复杂,难以理解。因为我们使用public、private和others语句来简化对代码的理解,就像我们使用的jar和其他人创建的jar一样。我想说的是,我们不需要发明,我们需要学习和继续


我希望从我的英语道歉,我正在努力提高,我希望在未来写清楚

可接受性修改器是封装概念的实现