代码优先。
class A
{
private A(){}
public static A.Builder Builder()
{
/**
* ERROR:
* No enclosing instance of type A is accessible.
* Must qualify the allocation with an enclosing instance of type A
* (e.g. x.new A() where x is an instance of A).
*/
return new A.Builder();
// Error too
//return new Builder();
}
public class Builder
{
private Builder()
{}
}
}
问:如何实例化构建器但不更改静态构建器和嵌套类名?
修改
如果类是静态的,如何保存每个构建器的日期?如何链接构建过程?
public static class Builder
{
private Builder()
{}
public Builder add(int a)
{
return this;// how to chain the build process ?
}
public Builder add(float a);
public List<Double> Build();
}
好的,我应该先google java builder模式。Here就是一个例子。
答案 0 :(得分:2)
规则:如果在封闭类之外使用内部类,则它必须是静态的。
public static class Builder
{
private Builder()
{
}
}
这是设计的。
答案 1 :(得分:1)
要在不使嵌套类静态的情况下进行编译,您需要一个A:
的实例A a = new A();
return a.new Builder();
或更短的版本:
return new A().new Builder();
但是使用嵌套的静态类而不是内部类可能更有意义,因此您可以实例化新的Builder而无需创建新的A ..
答案 2 :(得分:0)
您的代码有多个错误或不良做法。 该课程的名称与您的问题无关。
构造函数看起来像方法,但它们不是。您可能认为这是一个名为Builder的方法,但它不是,它是一个构造函数,构造函数没有返回类型+名称,只是类的名称:
public class Builder
{
private Builder() // <-- CONSTRUCTOR
{}
}
但这是一种静态方法:
class A
{
public static A.Builder Builder() <-- METHOD (with return type and name)
{ ... }
}
方法名称应以小写字母开头(这不会影响构造函数),因此这是一个错误,应该命名为builder()
。
编译问题意味着您正在尝试在静态上下文(类A的静态方法构建器)中创建非静态内部类的对象。您不能这样做,因为非静态内部类实例必须绑定到外部类的实例。
如果您不希望A.Builder实例与A实例相关,则将其设为静态。如果要绑定它们,则在A的非静态方法(或构造函数)中创建A.Builder实例,或者使用assylias指向的语法A a = new A(); Builder = a.new Builder();
。在这两种情况下,您都会将一个新的Builder实例绑定到A的实例。
答案 3 :(得分:0)
实际上,我需要的是一个与之不同的静态类 C#的静态类。Here 是一个很好的解释。 如果嵌套类不是静态的, 它需要一个实例化的容器类。 这就是我理解java中的静态类的方法。