Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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_Data Structures - Fatal编程技术网

在Java上创建数据结构的最惯用方法

在Java上创建数据结构的最惯用方法,java,oop,data-structures,Java,Oop,Data Structures,我正在用Java制作一个Card类,我希望它尽可能地地道。我是否应该封装所有字段,使其成为私有字段并提供getter,如下所示: 公共类卡实现可比性{ 私人诉讼; 私有字符串名称; 私有int值; 公共卡(字符、字符串名称、int值){ 这套衣服; this.name=名称; 这个值=值; } 公共字符getSuit(){ 反诉; } 公共字符串getName(){ 返回名称; } public int getValue(){ 返回值; } 公共字符串toString(){ 返回“+诉讼的名称+

我正在用Java制作一个Card类,我希望它尽可能地地道。我是否应该封装所有字段,使其成为私有字段并提供getter,如下所示:

公共类卡实现可比性{
私人诉讼;
私有字符串名称;
私有int值;
公共卡(字符、字符串名称、int值){
这套衣服;
this.name=名称;
这个值=值;
}
公共字符getSuit(){
反诉;
}
公共字符串getName(){
返回名称;
}
public int getValue(){
返回值;
}
公共字符串toString(){
返回“+诉讼的名称+”;
}
@凌驾
公共整数比较(卡){
返回整数。比较(值、卡值);
}
}
或者,由于任何字段都不会被修改,因此应公开并最终确定所有字段:

公共类卡实现可比性{
公共最终诉讼;
公共最终字符串名;
公共最终整数值;
公共卡(字符、字符串名称、int值){
这套衣服;
this.name=名称;
这个值=值;
}
公共字符串toString(){
返回“+诉讼的名称+”;
}
@凌驾
公共整数比较(卡){
返回整数。比较(值、卡值);
}
}
我正在阅读关于数据结构与OO类的章节,我不知道在这种情况下应该采取什么方法。提前谢谢

编辑: 这个类是我正在开发的21点的一部分,我需要从其他类访问字段

编辑:
这个问题已经被搁置,但是,这个问题应该发布在哪里呢?我应该把它移到代码审查吗?我真的很想知道更有经验的程序员对这个问题的看法,但我想把它发布在正确的网站上。理论上,当你设计OOP解决方案时,你必须提供,因此,你的第一种方法是走下去。但是,我希望使用
hashCode()
来更清楚地说明卡的唯一性


你试图实现的被称为

我会让它们都是私有的和最终的,并给每个人一个getter。如果它们不能被修改,那么将它们公开和最终是没有意义的否?这将不必要地将它们暴露在类外。@Nexevis这个类是我正在开发的BlackJack的一部分,我需要从另一个类访问这些字段classes@Davichete但将其公开可以让它们被访问以进行修改和阅读,将它们私有化的一个要点是,如果愿意,您可以取消
设置它们的特权,而只保留
获取
。使用公共字段时,您不能删除
设置
。是的,
公共最终
字段将不可更改。但请注意,仅适用于参考;它不会阻止存储在字段中的可变对象发生变异。但是,根据我的经验,使用getter/setter是Java的惯用方法。但是,对于
public final
字段,我给了什么特权,而getter没有给?它暴露了同样的信息,不是吗?我能看到的唯一区别是可读性和性能,公开最终比getter更快。如果我遗漏了什么,请纠正我。您不应该使
public final
,因为它使属性在整个应用程序中都可用。因为封装是OOP的关键原则之一。如果您严格地希望确保属性不被修改,只需将
实现为不可变对象即可。所有字段
final
都不可变的类不是吗?您不能修改任何内容。公共getter也可通过整个应用程序使用,它提供的信息与
public final
字段相同。这两种方法都使属性不可修改。我仍然看不出一种方式和另一种方式之间有什么区别。我不打算窃取他的答案:我希望现在你能理解usageI的区别。我无法找到一种变异的方式,该类的任何字段,因为所有涉及的类型(char、int、String)都是不可变的。是否有任何方法可以使它们中的任何一个变异,即使它们是
最终的
?如果有,请告诉我。我理解
final
和不可变性之间的区别,但我认为这不是重点