在Java中直接获取变量值而不是使用getter可以吗?

在Java中直接获取变量值而不是使用getter可以吗?,java,getter,convention,Java,Getter,Convention,我正在写一个在坐标系上运行的程序,所以我需要经常使用坐标。我决定使用类,因为它显然允许轻松存储点的坐标 问题无处不在,在我的程序中,我将其存储为int,而Point在使用getX()和getY()方法时返回double。当然,我可以很容易地将它转换为int,但它看起来不太优雅,而且会给代码添加不必要的混乱 如果我直接得到值,可以吗?像这样: Point p = new Point(0, 0); int x = p.x; 而不是: int x = p.getX(); 我甚至不确定它是否有任何区

我正在写一个在坐标系上运行的程序,所以我需要经常使用坐标。我决定使用类,因为它显然允许轻松存储点的坐标

问题无处不在,在我的程序中,我将其存储为
int
,而
Point
在使用
getX()
getY()
方法时返回double。当然,我可以很容易地将它转换为
int
,但它看起来不太优雅,而且会给代码添加不必要的混乱

如果我直接得到值,可以吗?像这样:

Point p = new Point(0, 0);
int x = p.x;
而不是:

int x = p.getX();

我甚至不确定它是否有任何区别,我只知道getter和setter的存在是有原因的,应该被使用。

让我们来看看,您有两个类。这些是:
A类
B类

在类A中,有一个私有实例变量

A类:

Class A {
    private int a;

    public int getA() {
        return A;
    }

}
Class B {
    public void fetchA() {
        A classA = new A();
        int a = classA.getA();
    }
}
现在,您想从
Class B
访问
Class a
中名为
a
的变量。但这个变量是私有的。所以,现在我们需要getter方法,因为getter方法是公共的

B类:

Class A {
    private int a;

    public int getA() {
        return A;
    }

}
Class B {
    public void fetchA() {
        A classA = new A();
        int a = classA.getA();
    }
}
在这种情况下,我们需要getter方法

我正在写一个在坐标系上运行的程序,所以我需要 经常使用坐标。我决定使用Point类,因为它 显然允许轻松存储点的坐标

这个问题在我的程序中无处不在,我将它存储为int 使用getX()和getY()方法时,Point返回double

您确定它显然允许轻松地为您的域存储点的坐标吗?
我不这么认为。
如果需要操作一些
java.awt.Point
实例,使用
java.awt.Point
类是有意义的

这门课似乎不适合你的需要。

  • 如果您真的不需要使用
    java.awt.Point
您应该创建并使用自己的
类,在编写以下内容时返回
int
值:

int x = p.getX();
  • 如果您改变主意,并且碰巧需要为某些任务使用
    java.awt.Point

在自定义
Point
类中,添加一个方法来返回
java.awt.Point
实例。

@Sarjan是的……有些人可能会认为setter和getter是邪恶的。但我想它在各种情况下都非常有用,尤其是在大型项目中。一个示例是验证。比方说,如果你只想在x大于0时设置x,如果它是公共的,你就不能优雅地执行它(除非你在设置变量之前做了一个检查...无处不在!!!..乏味的权利??如果某个新程序员在你的项目上工作并且没有意识到这一点,错过它有朝一日会使你的系统崩溃)…如果你使用setter,您可以在setter本身内部检查它是否大于0,从而提供了简单的实现


PS:我无法对此发表评论,因为它太长,因此是作为答案写的。

您已经链接了关于
点的文档。因此,仔细阅读并思考你的问题,而不是开始编码和思考,首先想到一个想法。然后了解
java.awt.point
类是否最适合您的情况

如果它不适合您的情况,您可以实现一个类。否则,请遵循文档。遵循文档和OOP概念是一个很好的实践

Point p = new Point(0, 0);
如果您按照文档进行操作,您将看到以下内容:

Point()
: 在曲面的原点(0,0)处构造并初始化点 坐标空间

我想你对这件事不太清楚。但是,

Point p = new Point();
int x = p.x;
这不是问题,因为
x
public
并且是您的程序。但他们为什么要实施这一点:

getX();

也请阅读这些-,.

可能与@MohamedAneesA重复的内容我见过这条线索,但它是关于我创建自己的类的情况。在我的例子中,类已经存在,而不是我的。我只是想知道直接获取值是否是一种不好的做法。我建议,如果您希望以这种方式访问数据,最好创建自己的类,该类包含
,并提供委托给
的访问者。通过这种方式,您可以
装饰类并利用组合。如果以后决定将数据直接存储为
int
,您将受到保护。编辑:davidxxx有一个直接使用自己的示例。回答得很好,谢谢!我真的不知道为什么,但我认为使用现有的类比创建一个非常类似的类要好得多。您是对的:使用现有类比创建非常相似的类要好得多。。。但前提是它能满足你的需要。这个类比较旧,不太容易使用。它继承自
Point2D
,该点操作
double
。如果
Point
也有特定的方法:
getIntX()
getIntY()
,那就不必担心了。但它没有这样做。因此,只有当您被迫或可以利用它时(例如,将Point对象发送给为您执行任务的现有类或第三方类),使用
Point
才有意义。