Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/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_Nested Class - Fatal编程技术网

Java 何时使用嵌套类?

Java 何时使用嵌套类?,java,nested-class,Java,Nested Class,下面的代码将找到两条线的交点并返回point对象。若点仅由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() {

下面的代码将找到两条线的交点并返回point对象。若点仅由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);
    }

如果任何其他类都不需要该点类,并且该点类不需要访问IntersectionF2Lines的私有类成员,则可以将该点类设置为静态嵌套类

静态嵌套类是一个较轻的内部类,它不能访问超类成员,通常与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;
    }

}

如果
Point
仅由
intersectionof2line
创建,我会将其实现为一个静态嵌套类:通过这种方式,您可以将构造函数声明为
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);
    }
如果构造函数是私有的,编译器将强制执行您的设计/意图


如果包含结果的类的可见性是公共的(在您的示例中,它是包私有的),并且您不希望其他人实例化“您的”类,因为这会创建一个额外的依赖项,那么这一点特别有用。

从数学上讲,线是由点数组成的。如果要在外部创建点类,可以使用它来显示特定直线上的点,即直线的端点,因此它应该是一个普通类,而不是相交直线的嵌套类。

创建嵌套类的主要原因是它们可以访问其父类的所有成员,也可以访问私有类。您的Point实例是否需要对IntersectionOfLines类成员的访问权限?否。他们不需要对IntersectionOfLines的任何访问权限我个人质疑您是否需要在单独的类中使用
calculateIntersection
方法来指向另一个问题:您是否计划在其他类中使用Point类?如果是,则不将它们嵌套也是一个很好的理由,除非您希望将它们与
相交F2行一起使用。Point
类型引用。是的,其他类将使用getter简单地打印结果。通常-如果函数需要返回2个值,它应该使用外部类还是内部类(例如itr)