何时使用嵌套类?

时间:2013-06-15 22:10:56

标签: java nested-class

下面的代码将找到2行的交集并返回点对象。如果只有IntersectionOf2Lines类创建point,我应该指出一个嵌套类吗?如果不是那么为什么不呢?感谢

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);
    }

3 个答案:

答案 0 :(得分: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;
    }

}

答案 1 :(得分: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),并且您不希望其他人实例化“您的”类,则此功能特别有用,因为这会产生额外的依赖。

答案 2 :(得分:0)

数学上,Line由多个点组成。如果你在外面创建Point类,你可以使用它来显示特定行上的点,行的终点,所以它应该是一个普通的类而不是IntersectionOf2Lines的嵌套类。