Java 以类似于 C# 的风格初始化 class
Java initialize class in style like in C#
我在 Java 很基础,因为我是全职 C# 开发人员,但我需要在 Android.
做一些私人项目
在 C# 中我可以做这样的事情:
public class Test
{
public string A {get;set;}
public OtherClass B {get;set;}
}
public OtherClass ()
{
string Some {get;set;}
string Again {get;set;}
}
现在,当我想使用 class 测试时,我可以执行如下代码:
var test = new Test
{
A = "test",
B = new OtherClass
{
Some = "Some",
Again = "Again"
}
};
多亏了这个,我现在已经以清晰的方式初始化了测试。
当我想在 Java 中执行此操作时,我必须编写如下代码:
public class Test
{
private string A;
public string GetA()
{
return A;
}
public void SetA(string a)
{
A = a;
}
privte OtherClass B;
public OtherClass GetB()
{
return B;
}
public void SetB(OtherClass b)
{
B = b;
}
}
public class OtherClass
{
private string Some;
public string GetSome()
{
return Some;
}
public void SetSome(string some)
{
Some = some;
}
privte string Again;
public string GetAgain()
{
return Again;
}
public void SetAgain(string again)
{
Again = again;
}
}
我知道 Java 必须有 Seter 和 Geter 到字段,我对此没问题,但现在如果我想像在 C# 中使用它一样使用 Test
对象,我必须做类似的事情:
OtherClass otherClass = new OtherClass();
otherClass.SetSome("Some");
otherClass.SetAnothier("Another");
Test test = new Test();
test.SetA("A")
test.SetB(otherClass);
IMO 这不是一个很好的和明确的声明。我知道我可以添加构造函数,例如:
public Test(string a, otherClass b)
{
A = a;
B = b;
}
和
public OtherClass(string some,string another)
{
Some = some;
Another = another;
}
并像这样使用它:
Test test = new Test("Test",new OtherClass("some","Another"));
但是当我有更复杂的 classes(例如有 200 个字段(是的,我有那个))时,构造函数会很长并且很难阅读。
那么我可以用我向您展示的其他方式在 Java 中初始化 class 吗?
感谢
您实际上也可以在 java 中使用 object initializers
,但是它们被称为 double brace initializers
。示例:
Test test = new Test()
{{
SetA("test");
SetB(new OtherClass()
{{
SetSome("Some");
SetAgain("Again");
}});
}};
但是您可能不应该使用它,因为它有一些 weird/unexpected 副作用。此示例为 Test
和 OtherClass
生成 AnonymousInnerClass
。您可以阅读更多关于双括号初始值设定项 here.
如果您的参数多于您希望传递给构造函数的参数,您可以按照建议使用构建器模式 by this answer。
我在 Java 很基础,因为我是全职 C# 开发人员,但我需要在 Android.
做一些私人项目在 C# 中我可以做这样的事情:
public class Test
{
public string A {get;set;}
public OtherClass B {get;set;}
}
public OtherClass ()
{
string Some {get;set;}
string Again {get;set;}
}
现在,当我想使用 class 测试时,我可以执行如下代码:
var test = new Test
{
A = "test",
B = new OtherClass
{
Some = "Some",
Again = "Again"
}
};
多亏了这个,我现在已经以清晰的方式初始化了测试。
当我想在 Java 中执行此操作时,我必须编写如下代码:
public class Test
{
private string A;
public string GetA()
{
return A;
}
public void SetA(string a)
{
A = a;
}
privte OtherClass B;
public OtherClass GetB()
{
return B;
}
public void SetB(OtherClass b)
{
B = b;
}
}
public class OtherClass
{
private string Some;
public string GetSome()
{
return Some;
}
public void SetSome(string some)
{
Some = some;
}
privte string Again;
public string GetAgain()
{
return Again;
}
public void SetAgain(string again)
{
Again = again;
}
}
我知道 Java 必须有 Seter 和 Geter 到字段,我对此没问题,但现在如果我想像在 C# 中使用它一样使用 Test
对象,我必须做类似的事情:
OtherClass otherClass = new OtherClass();
otherClass.SetSome("Some");
otherClass.SetAnothier("Another");
Test test = new Test();
test.SetA("A")
test.SetB(otherClass);
IMO 这不是一个很好的和明确的声明。我知道我可以添加构造函数,例如:
public Test(string a, otherClass b)
{
A = a;
B = b;
}
和
public OtherClass(string some,string another)
{
Some = some;
Another = another;
}
并像这样使用它:
Test test = new Test("Test",new OtherClass("some","Another"));
但是当我有更复杂的 classes(例如有 200 个字段(是的,我有那个))时,构造函数会很长并且很难阅读。
那么我可以用我向您展示的其他方式在 Java 中初始化 class 吗?
感谢
您实际上也可以在 java 中使用 object initializers
,但是它们被称为 double brace initializers
。示例:
Test test = new Test()
{{
SetA("test");
SetB(new OtherClass()
{{
SetSome("Some");
SetAgain("Again");
}});
}};
但是您可能不应该使用它,因为它有一些 weird/unexpected 副作用。此示例为 Test
和 OtherClass
生成 AnonymousInnerClass
。您可以阅读更多关于双括号初始值设定项 here.
如果您的参数多于您希望传递给构造函数的参数,您可以按照建议使用构建器模式 by this answer。