2013-06-15 1 views
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); 
    } 
+0

Основная причина для вложенности вложенных классов заключается в том, что они имеют доступ ко всем членам своего родительского класса, а также к частным. Будет ли ваш экземпляр Point нужен такой доступ к членам класса IntersectionOf2Lines? – Pshemo

+0

Нет. Они не нуждаются в доступе к IntersectionOf2Lines – JavaDeveloper

+0

Я лично сомневаюсь, нужен ли вам метод 'calculateIntersection' в отдельном классе для Point –

ответ

1

Если класс точки не требуется какой-либо другой класс и класс точки не требуется доступ к закрытым членам класса в IntersectionOf2Lines, то вы могли бы сделать Класс Point статический вложенный класс.

статический вложенный класс более светлый внутренний класс, который не имеет доступа к супер членам класса и часто используется как структуры в С.

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 должен быть обычный класс, а не вложенный класс.