何时使用嵌套类?

3
下面的代码将查找两条线的交点并返回点对象。如果点只会被IntersectionOf2Lines类创建,那么我应该将点设为嵌套类吗?如果不是,为什么不是呢?谢谢。
class Point {
    private final int x;
    private final int y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

    int getX() {
        return x;
    }

    int getY() {
        return y;
    }
}

public class IntersectionOf2Lines {

    public static Point calculateIntersection(Line line1, Line line2) {
        int x = (line2.getConstant() - line1.getConstant()) / (line1.getSlope() - line2.getSlope());
        int y = line1.getSlope() * x + line1.getConstant();

        return new Point(x, y);
    }

创建嵌套类的主要原因是它们可以访问其父类的所有成员,包括私有成员。您的Point实例是否需要访问IntersectionOf2Lines类成员的这种访问权限? - Pshemo
不需要访问IntersectionOf2Lines。 - JavaDeveloper
我个人质疑你是否需要将calculateIntersection方法放在一个单独的类中,而不是Point类中。 - Anti Earth
另一个问题:您是否计划在其他类中使用Point类?如果是,则不将它们嵌套也是一个很好的理由,除非您想要使用它们与“IntersectionOf2Lines.Point”类型引用。 - Pshemo
是的,其他类将使用getter方法简单地打印结果。一般来说,如果一个函数需要返回2个值,它应该使用外部类还是内部类(例如itr)? - JavaDeveloper
3个回答

1
如果Point类不被其他任何类所需要且Point类不需要访问IntersectionOf2Lines的私有类成员,则可以将Point类设置为静态嵌套类静态嵌套类是一种较轻的内部类,它没有访问超类成员的权限,并且通常像C语言中的结构体一样使用。
package main;

public class Main {

    public static void main(String[] args) {

        MyPoint p = new MyPoint();
        p.x = 5;
        System.out.println("x: "+ p.x);

    }

    private static class MyPoint {
        int x;
    }

}

0
如果Point只由IntersectionOf2Lines创建,我会将其实现为一个静态嵌套类:这样你就可以将构造函数声明为private
public class IntersectionOf2Lines {
    static class Point {
        private final int x;
        private final int y;

        private Point(int x, int y) {
            this.x = x;
            this.y = y;
        }

        int getX() {
            return x;
        }

        int getY() {
            return y;
        }
    }

    public static Point calculateIntersection(int line1, int line2) {
        int x = 1;
        int y = 2;

        return new Point(x, y);
    }

如果构造函数是private,编译器会强制执行您的设计/意图。

如果包含结果的类的可见性为public(在您的示例中,它是package private),并且您不希望其他人实例化“您”的类,因为这会创建额外的依赖关系,则此功能特别有用。


0
数学上,直线由许多点组成。如果您正在创建 Point 类,则可以使用它来显示特定直线上的点、直线的端点,因此它应该是一个普通类,而不是嵌套类到 IntersectionOf2Lines。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接