Java 我应该使用内部类吗?里面的示例代码

Java 我应该使用内部类吗?里面的示例代码,java,inner-classes,Java,Inner Classes,我喜欢尽可能地整合我的代码/类,而不让每个类本身变得混乱。因此,我考虑使用嵌套类,尽管在本例中使用内部类,因为内部类需要访问外部类的成员 例子 假设我有一个程序,可以计算形状的各种形状属性。因此,给定一个矩形形状,它将从长度和宽度的输入中找到面积/周长 我首先创建一个抽象类形状,它有抽象方法getArea()和getperiment()。然后,我将创建我的子类矩形,扩展形状类,@用必要的逻辑覆盖那些方法 现在有一个矩形棱镜(立方体)。它具有与矩形形状相同的变量/方法,但有一个额外的高度。在过去

我喜欢尽可能地整合我的代码/
,而不让每个
本身变得混乱。因此,我考虑使用
嵌套类
,尽管在本例中使用
内部类
,因为
内部类
需要访问
外部类
的成员


例子 假设我有一个程序,可以计算形状的各种形状属性。因此,给定一个矩形形状,它将从长度和宽度的输入中找到面积/周长

我首先创建一个
抽象类形状
,它有
抽象方法
getArea()
getperiment()
。然后,我将创建我的
子类
矩形
扩展
形状
@用必要的逻辑覆盖那些
方法

现在有一个矩形棱镜(立方体)。它具有与矩形形状相同的
变量
/
方法
,但有一个额外的高度。在过去,我会创建另一个
矩形
子类
,然后从那里开始

使用
内部类
而使用
抽象类
PrismShape
是更好还是更差?我这样问是因为无论形状如何,
Prisms
都使用相同的方法。如果你对以上内容感到困惑,我会在下面发布我所说内容的代码


示例代码
Shape类

PrismShape类

矩形形状类


我对批评持开放态度,对Java还是相当陌生的。在这期间我的思维过程是我有2d形状属性和3d(棱柱)形状属性。三维形状从二维形状派生属性,而不是从二维形状派生属性。因此,至少对我来说,拥有
内部类是有意义的。

我自己的看法是:当程序的其余部分有一个外部类的对象时,公共内部类似乎最有用,它希望创建一个内部类的对象,该对象以某种方式“属于”外部类对象;也就是说,它与它紧密相关

然而,按照您的安排方式,这意味着如果客户机想要创建一个
RecPrismShape
对象,它必须首先创建一个该prism对象所属的
RectangleShape
对象。最有可能的是,这不会有用。也就是说,客户端创建一个
RectangleShape rect
仅仅是因为它必须创建一个
RecPrismShape
,而
rect
对象在其他任何方面对它都没有用处

我认为更好的办法是让
RecPrismShape
对象将
private RectangleShape
对象作为其字段之一,但这将是一个“实现细节”。这样,您就可以重用
RectangleShape
代码,这似乎是您正在尝试的

public class RecPrismShape extends RectangleShape {

    private RectangleShape rect;
    private double height;

    public RecPrismShape(double length, double width, double height) {
        rect = new RectangleShape(length, width);
        this.height = height;
    }

    // and just one example of how you could use it
    public double getVolume() {
        return rect.getArea() * getHeight();
    }

}

这个示例设计得很糟糕,因为您的示例基类不包含实现,因此可能只是
接口
s,任何类都可以实现任意数量的接口。通常,大多数语言(尤其是
Java
)中的内部类仅在声明
InnerClass
仅在
OuterClass
@aruistante的上下文中使用时才使用,假设我在本例中使用的是抽象,并且实现是计算给定用户输入的形状属性,这有用吗?我尽量保持简洁,长问题并不有趣,尽管我认为这是一个很长的问题。我从来没有改变顶级类,它是set framework。好的,但是在这种情况下,
ShapePrism
没有扩展
Shape
有什么原因吗?如果要创建一组不同的2D形状和3D形状,它们实际上是独立的类树,我仍然不明白为什么要尝试通过
内部类将它们关联起来。没问题。另一件需要考虑的事情是,在这种情况下,2D形状实际上只是高度为0的3D形状的特例,其3D方法将返回0。这是一个设计模式的问题,而不是正确的方法。我建议你一起读这本书。谢谢,我同意你的看法。不过,正如上面有人建议的那样,我将转到另一个方向,每个形状和2d对象都有一个单独的棱柱类,高度为0。
public abstract class PrismShape{        
    public abstract double getVolume();
    public abstract double getSurfaceArea();
    public abstract double getLateralArea();
    
}
import Abstract.Shape;
import Abstract.ShapePrism;

public class RectangleShape extends Shape{
    //Variables Declared
    private double _length, _width;

    //Constructor
    public RectangleShape(double _length, double _width) {
        setLength(_length);
        setWidth(_width);
    }

    //Getters and Setters
    @Override
    public double getArea() {
        return getLength() * getWidth();
    }

    @Override
    public double getPerimeter() {
        return (2 * getLength())+ (2 * getWidth());
    }
        
    public double getLength() {
        return _length;
    }

    private void setLength(double _length) {
        this._length = _length;
    }

    public double getWidth() {
        return _width;
    }

    private void setWidth(double _width) {
        this._width = _width;
    }
    
    //Inner Class Prism
    public class RecPrismShape extends PrismShape{
        
        //Variables Declared
        private double _height;
        
        //Constructor
        public RecPrismShape(double _height) {
            setHeight(_height);
        }        
     
        //Getters and Setters
        @Override
        public double getSurfaceArea(){
            return (getLateralArea() + (2 * getArea()));
        }
    
        @Override
        public double getVolume(){
            return getArea() * getHeight();
        }
    
        @Override
        public double getLateralArea(){
            return getPerimeter() * getHeight();
        }

        public double getHeight() {
            return _height;
        }

        private void setHeight(double _height) {
            this._height = _height;
        }        
    }
    
}
public class RecPrismShape extends RectangleShape {

    private RectangleShape rect;
    private double height;

    public RecPrismShape(double length, double width, double height) {
        rect = new RectangleShape(length, width);
        this.height = height;
    }

    // and just one example of how you could use it
    public double getVolume() {
        return rect.getArea() * getHeight();
    }

}