【问题标题】:Blank final variables空白最终变量
【发布时间】:2019-04-13 06:58:03
【问题描述】:

我正在尝试合并

  1. 对变量的公共访问
  2. 非静态变量
  3. 非预定义值
  4. 一次设定值(最终)
  5. 整数或整数

更新的代码不起作用,关于“如何做”的答案一定很简单,但我需要帮助:

public class foo
{
    public final int smth; //Variable might not have been initialized
    public final Integer smthElse; //Variable might not have been initialized

    public foo(JSONObject myObj)
    {
        if(myObj != null) {
            try {
                int extraParam = Integer.parseInt("ABCD"); //This is just an example for Exception to be called
                smth = extraParam;
                smthElse = extraParam;
            } catch (Exception e) {}
        } else {
            smth = 1;
            smthElse = 2;
        }
    }
}

附:我不想使用(private int + public getter + private setter)

【问题讨论】:

  • 你的代码编译得很好。您可能没有向我们展示您的真实代码。
  • 现在错误很明显了:如果 myObj 为空怎么办?在这种情况下你会初始化字段吗?不。因此错误消息,确切地说。
  • @JBNizet 我已经编辑了代码。我想“如果”是“变量可能尚未初始化”的答案。如果我无法将其与任何内容进行比较,我该如何检查代码最后几行中的 final int 以设置默认值?
  • 在设置默认值时添加 else 语句
  • 你应该遵循 Java 命名约定:类名总是以大写开头。

标签: java int final


【解决方案1】:

当您在 try 块中执行赋值时,编译器在 try … catch … 构造之后将其视为“可能发生或可能未发生”,这使得它不适用于您想要在此之后使用的 final 变量构造。

解决方案是使用可以多次分配的临时非最终变量,并在操作结束时对 final 变量进行明确分配。

例如

public class Foo
{
    public final int smth;
    public final Integer smthElse;

    public Foo(JSONObject myObj) {
        int smthValue = 1;
        Integer smthElseValue = 2;

        if(myObj != null) try {
            int extraParam = Integer.parseInt("ABCD"); //This is just an example
            smthValue = extraParam;
            smthElseValue = extraParam;
        } catch (Exception e) {}

        smth = smthValue;
        smthElse = smthElseValue;
    }
}

【讨论】:

    【解决方案2】:

    myObj 为 null 时,不会设置最终字段。这会导致编译错误,必须在foo(Object myObj, int extraParam)构造函数完成后设置。

    如果您需要创建foo 的实例,可以添加else 块。

    public foo(Object myObj, int extraParam) {
      if (myObj != null) {
        smth = extraParam;
        smthElse = extraParam;
      } else {
        smth = 0;
        smthElse = 0;
      }
    }
    

    或者创建一个工厂方法来执行检查。

    private foo(int extraParam) {
      smth = extraParam;
      smthElse = extraParam;
    }
    
    public static foo from(Object myObj, int extraParam) {
      return (myObj == null) ? new foo(0) : new foo(extraParam);
    }
    

    【讨论】:

    • 我确实需要获取这个类的实例,但是如果这个类本身不能检查值,那么这个类是la脚的。这个想法是无论如何都要设置最终值,即使一切都是错误的。并且在类的构造函数中的 try{}catch 中可能会出错,所以我必须编写最后一次检查 (if(smth == null) { //set final int to default value }) ...但是“smth”不能与 null 相比!好像是死路一条。
    • @AlexShiganov 我已经更新了答案以满足您的要求,但从您提供的这个简单示例中感觉更像是Optional<foo> 的用例。
    • 我已经更新了我的示例代码以显示不可预测性。其实我用的是JSON、XML、线程,可能会出现很多种异常,但在我的示例代码中我自己称之为。
    • @AlexShiganov 停止发布不同的代码,这会适得其反。这次故障出在catch (Exception e) {}。空的{} 是不会设置字段的路径。
    • @AlexShiganov 你的foo 类有很多责任,如果它是一个POJO,它不应该做输入解析。 final 字段没有任何问题,但您似乎正在编写 God Object
    猜你喜欢
    • 2015-05-22
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    相关资源
    最近更新 更多