【问题标题】:How to declare uninitialized variable in abstract class in Java?如何在 Java 的抽象类中声明未初始化的变量?
【发布时间】:2014-02-20 20:35:39
【问题描述】:

我想声明一个抽象类,它有一个要在其子类中初始化的变量。例如,假设我们有一个名为 Country 的抽象类和一个名为 United States 的子类。 (我知道,通常你会让美国成为 Country 的一个实例,但我只是以此为例,所以我们假设这是我们要进行的设计。)我想要一个名为 bigCities 的public final Set<String>在 Country 中已声明但未初始化,但将在美国初始化为 {"New York", "Los Angeles", "Chicago"}。我将如何做到这一点?

(如果之前有人问过,我很抱歉,但我的问题很难制定精确的搜索词。每次我尝试在 Google 或 StackOverflow 上搜索时,我都会遇到与我相似但不是我的问题正在寻找。)

【问题讨论】:

  • 我可能在超类中有一个构造函数接受这种参数,所以子类必须明确地用一个值调用它
  • 你有没有尝试过? Stack Overflow 旨在帮助您在用尽自己的资源后解决问题。这是一个非常基本的问题,因此虽然提供答案很容易,但答案并不能解决您潜在的困惑(因为我们看不到您卡在哪里)
  • 我有 50 个这样的变量,就像 bigCities 一样。我宁愿不必将所有这些参数都作为函数的参数,因为这会使代码看起来非常混乱。有办法解决吗?
  • @user477766 嗯,那听起来你的设计很糟糕。
  • @njzk2 应该将其添加为答案。

标签: java inheritance abstract-class


【解决方案1】:

如果您想将您的属性 bigCities 定义为 final 它必须在类的构造函数中初始化,在您的情况下是 CountryUnitedStates

public abstract class Country {
  public final Set<String> bigCities;
  public Country(Set<String> bigCities) {
    this.bigCities = bigCities;
  }
}

在这种情况下,Country 的子类必须使用指定的参数调用父类的构造函数。

【讨论】:

    【解决方案2】:

    有两种方法可以做到这一点。您可以让 Country 构造函数有一个名为 bigCities 的参数,而 UnitedStates 等子类将调用 super(cities, otherArgs)。

    或者,您可以制作这样的抽象方法

    protected abstract Set<String> getBigCities();
    

    然后在 Country 构造函数中,将 bigCities 设置为该方法的实现。

    bigCities = getBigCities();
    

    【讨论】:

    • 在这种情况下,您不能创建抽象方法,因为属性bigCities 被声明为final
    • 如您所述,在构造函数中调用非最终方法也是一种不好的做法;不能保证它们在子类中的行为。
    • @Manuel 你确定吗?我刚刚进行了快速测试,它似乎工作正常。
    • @kabb 那么在声明字段 final 时,您没有测试您刚刚描述的内容。
    • 肯定有该字段声明为final。也许你误读了我的建议,它绝对可以编译并运行良好。
    【解决方案3】:
    abstract class Country {
    
        public final Set<String> bigCities;
    
        protected Country(String... bigCities) {
            this.bigCities = new HashSet<String>(Arrays.asList(bigCities));
        }
    
    }
    
    class USA extends Country {
        USA() {
            super("NY", "Chicago");
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-09
      • 2021-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-10
      • 2012-06-04
      • 2016-12-28
      相关资源
      最近更新 更多