java - 对象方法调用可以和对象实例化同时进行吗?

标签 java this instantiation

我正在尝试使用 java 类 BitSet 作为自定义类的字段。我希望该类使用默认的 BitSet 并设置所有位。

import java.util.BitSet;

public class MyClass {
    private BitSet mask;

    public MyClass() {
        this(new BitSet(4));
        // want to set all bits first
        // something like 
        // this( new BitSet(4).set(0,3) );
    }

    public MyClass(BitSet mask) {
        this.mask = mask;
    }    
}

默认情况下,BitSet 构造函数取消设置所有位。所以在我将它作为匿名对象发送之前,我想调用 set(int, int) 方法来设置所有位。我知道我可以简单地将字段 mask 初始化为一个新的 BitSet,然后从那里调用 set(int, int) 方法。

但是,一般来说,我想知道是否可以在对象实例化时访问实例方法?

最佳答案

为什么不编写一个单独的构造函数来允许 BitSet 初始化?使用 Java 8,这看起来像这样:

public class MyClass {
  private BitSet mask;
  public MyClass() {
    this(new BitSet(4),(m)->m.set(0,3));
  }
  public MyClass(BitSet mask,Consumer<BitSet> initializer) {
    initializer.accept(mask);
    this.mask = mask;
  }
}

您甚至可以通过引入带有类型参数的静态方法来使其更加通用:

public static <T> T initialize(T t,Consumer<T> initializer) {
  initializer.accept(t);
  return t;
} 

在那种情况下,早期的 MyClass 将如下所示:

public class MyClass {
  private BitSet mask;
  public MyClass() {
    this(initialize(new BitSet(4),(m)->m.set(0,3)));
  }
  public MyClass(BitSet mask) {
    this.mask = mask;
  }
}

更新

还有另一种方法,无需引入新方法或构造函数:

public class MyClass {
  private BitSet mask;
  public MyClass() {
    this(new BitSet(4) {{ set(0,3); }});
  }
  public MyClass(BitSet mask) {
    this.mask = mask;
  }
}

anonymous class正在通过扩展 BitSet 并添加 instance initialization block 来实例化,因此 double curly braces .

关于java - 对象方法调用可以和对象实例化同时进行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36806353/

相关文章:

java.lang.NullPointerException : Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference

c++ - gcc 无法使用此捕获编译通用 lambda

javascript - 如何避免在 Javascript 原型(prototype)中使用 "this"

c++ - 是否可以从数组初始化字符串 vector ?如果是这样,如何?

java - 无法在 Switch 语句中实例化字符串数组 - Java

java - 在方法内实例化两个对象用作 'return values'

java - 对 arrayList 感到困惑

java - 如何自动增加字符串/整数以提高效率?

java - 为什么在实现 Runnable 时使用 Thread.currentThread().isInterrupted() 而不是 Thread.interrupted()?

javascript - GSAP Draggable with React ES6 实际这个