首页 > 解决方案 > 是否可以在 Java 的编译时接收子类的名称?

问题描述

我正在尝试在 java 中创建一个小吃机实现。我创建了一个名为的抽象类Product,它将为每个提供的产品提供基本设计。

我的意思是我们有abstract class Product继承自.NachosCakeProduct

Product类不包含太多,它只包含产品的namepriceavailable amount(这些是类中的字段)。

它还具有get用于仅返回每个字段值的字段的方法。

问题是我想将name产品的 设置为 astatic final因为如果产品的名称是Nachos,它不会被更改。我的意思是可以创建更多Nachos对象,但它们的类的名称仍然是Nachos.

所以没有理由不这样做static final

问题是我不确定如何正确设置它。

public abstract class Product {
    
    private static final String productName = getClass().getSimpleName();
    private int price;
    private int amount;

....
Constructor..

Get methods..

我考虑过getClass().getName()getSimpleName()但它给了我一个 IDE 错误,这表明我也使用该字段static final以及使用该字段的唯一方法getClass是编写Product.class.getName();.

问题是,如果我这样做,将返回的名称是Product而不是CakeNachos或其他子类。

标签: javaclassinheritancestaticabstract-class

解决方案


如果您的类有一些描述该类的属性(例如产品名称),那是该类的一个属性。您不应该编写将类本身的名称与 getClass().getName() 一起使用的代码,这会将您的业务逻辑与实现细节联系起来,并且没有理由(或很少有充分的理由),为什么您的代码需要知道类本身的名称。

相反,在你的类中添加一个像 productName 这样的属性:

public class Product{

    private String productName;

    public Product(String name){
        this.productName = name;
    }

    public String getProductName(){
        return this.productName;
    }
}

推荐阅读