编辑:对不起我之前的问题, 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。
答案 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
类型为null
和int
类型为零值等。)
类构造函数是验证所提供的所有必填字段的正确位置,因此创建自己的构造函数以检查对象期间传入的所有必填字段创建:
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
类的数据。