确保字段是从构造函数初始化的

时间:2017-05-03 05:47:59

标签: java

编辑:对不起我之前的问题, final 关键字会让您感到困惑,这是不合适的。抱歉我的英语也很差。

----- ------问题

假设我有一个没有任何构造函数的模型类,因为我需要在许多不同的逻辑中初始化它。 但是我有一个 notnull 关键字。

public class Model {
    public notnull String name;
    public notnull String address;
    public notnull int age;
}

我需要在不同的地方使用它,但要检查所有 notnull 字段是否在编译时初始化

Model m = new Model();
m.name = "Hello";
m.age = 15;
// syntax error, you should set Model.address

或者

Model m1 = new Model();
m1.address = "World";
m1.age = 20;
// syntax error, you should set Model.name

我如何在java中实现这一点? THX。

5 个答案:

答案 0 :(得分:2)

  

假设我有一个没有任何约束器的模型类

这是不可能的。每个类都有一个构造函数。如果您没有定义一个,则最终使用默认构造函数。在你的情况下:

public Model() {
    super();
}
  

检查是否所有最终字段都已初始化

首先,必须初始化最终字段,否则编译器将无法编译。因此,您必须初始化最终字段:

  • 在构造函数中
  • 宣布最终字段时

构造函数初始化

public final String name;
public final int age;

public Model() {
    this.name = "Hello";
    this.age = 13;
}

声明初始化

public final String name = "Hello";
public final int age = 13;

public Model() {
    super();
}

答案 1 :(得分:1)

您可以通过以下方式实现似乎所需的内容:

public class Model {
    private final String name;
    private final String address;
    private final int age;

    public Model(final String name, final String address, final int age) {
        if (name == null) {
            throw new IllegalArgumentException("please provide a name");
        }
        if (address == null) {
            throw new IllegalArgumentException("please provide an address");
        }
        this.name = name;
        this.address = address;
        this.age = age;
    }

    // getters
}

用法:

new Model("World", "Some address", 20) // OK
new Model("World", null, 20) // Exception because null address.

答案 2 :(得分:0)

你应该看看Builder模式。您可以在互联网上找到有关如何使用它的文章。这是一个例子https://jlordiales.me/2012/12/13/the-builder-pattern-in-practice/。使用Builder模式,您可以验证是否设置了某些字段,如果没有,则抛出异常。

答案 3 :(得分:0)

如果只是最终: 您可以在构造函数内声明或实例化的位置实例化它们。

如果是最终+静态: 你必须在声明的地方实例化它们。

因为它们不是静态的,你需要实例化你指定它们的位置或构造函数。

答案 4 :(得分:0)

  

假设我有一个没有任何构造函数的模型类,因为我需要   在许多不同的逻辑中初始化它。但我有一个不知所措   关键字。

你需要注意即使你没有编写任何构造函数,编译器也会提供一个默认的无参数构造函数,它会自动将对象中的所有字段初始化为默认值(即,String类型为nullint类型为零值等。)

类构造函数是验证所提供的所有必填字段的正确位置,因此创建自己的构造函数以检查对象期间传入的所有必填字段创建:

public class Model {
    private String name;
    private String address;
    private int age;

    public Model(String name, String address, int age) {
         if(name == null) { 
               throw new IllegalArgumentException(" Name is mandatory ");
         } 
         if(address == null) { 
               throw new IllegalArgumentException(" Address is mandatory ");
         }
         if(age < 0) { 
               throw new IllegalArgumentException(" Age is Invalid ");
         }
         this.name = name;
         this.address = address;
         this.age = age;
    }
   //Add getters and setters
}

此外,通过标记您的字段Model(如上所示)来封装private类的数据