是否可以从另一个(在同一个类中,而不是从子类中)调用构造函数?如果有,怎么样?什么是调用另一个构造函数的最佳方法(如果有几种方法可以做到)?
{{ ... }}Java中的Double Brace初始化语法()是什么?
所以我最近一直在研究我的Java技能,并且发现了一些我之前不知道的功能.静态和实例初始化器是两种这样的技术.
我的问题是什么时候会使用初始化程序而不是在构造函数中包含代码?我想到了几个明显的可能性:
static/instance initializers可用于设置"final"静态/实例变量的值,而构造函数则不能
静态初始化程序可用于设置类中任何静态变量的值,这应该比在每个构造函数的开头具有"if(someStaticVar == null)// do stuff"代码块更有效
这两种情况都假设设置这些变量所需的代码比简单的"var = value"更复杂,否则似乎没有任何理由使用初始化器而不是在声明变量时简单地设置值.
然而,虽然这些并非微不足道的收益(特别是设置最终变量的能力),但似乎应该使用初始化程序的情况相当有限.
当然可以在构造函数中使用初始化器来完成很多工作,但我真的没有看到这样做的原因.即使一个类的所有构造函数共享大量代码,使用私有initialize()函数似乎比使用初始化程序更有意义,因为它不会阻止您在编写新代码时运行该代码构造函数.
我错过了什么吗?是否还有许多其他情况需要使用初始化程序?或者它是否真的只是在非常具体的情况下使用的相当有限的工具?
java constructor initializer static-initializer initialization-block
这来自Effective Java:
// Implementing a fromString method on an enum type
private static final Map<String, Operation> stringToEnum
= new HashMap<String, Operation>();
static { // Initialize map from constant name to enum constant
for (Operation op : values())
stringToEnum.put(op.toString(), op);
}
// Returns Operation for string, or null if string is invalid
public static Operation fromString(String symbol) {
return stringToEnum.get(symbol);
}
Run Code Online (Sandbox Code Playgroud)
请注意,Operation常量将从创建常量后运行的静态块放入stringToEnum映射中.试图使每个常量从其自己的构造函数放入映射将导致编译错误.这是一件好事,因为如果它是合法的,它会导致NullPointerException.除编译时常量字段外,不允许枚举构造函数访问枚举的静态字段.这种限制是必要的,因为在构造函数运行时尚未初始化这些静态字段.
我的问题是关于这条线:
"请注意,操作常量将从创建常量后运行的静态块放入stringToEnum映射中".
我认为静态块在构造函数运行之前执行.实际上是在类加载时执行的.
我在这里错过了什么?
我有这个代码:
public static class MyWebDriver extends RemoteWebDriver {
@NotNull
private final String nodeId;
public MyRemoteWebDriver(@NotNull String nodeId) {
super();
this.nodeId = nodeId;
}
@Override
public void quit() {
System.out.println("deleting node: " + nodeId);
}
}
Run Code Online (Sandbox Code Playgroud)
并且保证nodeId传递给构造函数的不是null.因为nodeId字段是final我希望它在我的quit()方法中初始化.
但是,在super()构造函数中有一个try-catch块,在异常调用 quit() 方法的情况下抛出异常.在这种情况下nodeId,我进入我的quit()方法没有初始化(null有价值).
有没有办法避免它除外
@Override
public void quit() {
if (nodeId != null) {
System.out.println("deleting node: " + nodeId);
} …Run Code Online (Sandbox Code Playgroud) Jasmine是一个很好的JavaScript单元测试框架.它不仅测试您的代码,还提供了一种很好的方式来记录它:
我想知道C#和/或Java是否存在可比性.
这可能是一个非常基本的问题,但在Java学习的这个阶段让我感到困惑.我有以下代码:
package com.soti84;
import java.util.ArrayList;
public class InvokeMethod {
public static void main(String[] args) {
ArrayList<String> exams= new ArrayList<String>();
exams.add("Java");
exams.add("C#");
}
}
Run Code Online (Sandbox Code Playgroud)
如果我移动实例化ArrayList对象的行以及该方法外部对该对象的调用,则创建该对象的行很好,但不允许对该对象执行add()方法调用.这是为什么?
package com.soti84;
import java.util.ArrayList;
public class InvokeMethod {
ArrayList<String> exams= new ArrayList<String>();
exams.add("Java");
exams.add("C#");
public static void main(String[] args) {
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢.
我一直在努力学习Java,我正在研究一个项目.
我有一个名为Card的抽象类,我将其用作模板来创建子类.
它有一种设置卡的名称字段和颜色字段的方法以及设置成本的方法.
我有一个名为Workshop的卡子类.
我正在尝试使用Workshop in Workshop的方法来设置Workshop的名称和颜色字段.
为此,我正在调用方法super.setCardNameColor("Workshop", "Green")和super.setCardCost(0,0,0,0,0,0,0,0);
但是,为了做到这一点,Eclipse让我在类声明中使用(似乎是)双花括号.
我怀疑这与Anonymous Inner Classes有关,可能来自"超级"或类似的东西,但我的Google搜索都没有给我提供我需要的信息.任何人都可以在这里阐述一下这个问题吗?我正在使用sysout和getters来确保在Workshop的一个实例上正确设置了值,但是我对双括号感到困惑.提前感谢您的帮助!
编辑:这是代码
public abstract class Card
{
private String cardName = "";
private String cardColor = "";
private int coinCost = 0;
private int woodCost = 0;
private int brickCost = 0;
private int stoneCost = 0;
private int oreCost = 0;
private int glassCost = 0;
private int clothCost = 0;
private int paperCost = 0;
private int coinValue = 0;
private int pointValue …Run Code Online (Sandbox Code Playgroud) 我有一些其他开发人员编写的类:
public class ManifestFile implements Serializable {
private final static DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
private final static XPathFactory xPathFactory = XPathFactory.newInstance();
private final static DateFormat YYYYMMDD = new SimpleDateFormat("yyyyMMdd");
private final String uuid;
private final Set<File> attachments = new LinkedHashSet<File>();
private final transient ApplicationContext applicationContext = JavaService.INSTANCE.getApplicationContext();
private final transient File attachmentDirectory;
private final Date processAfter = new Date(System.currentTimeMillis() + 3 * 1000 * 60);
{
try {
documentBuilderFactory.setNamespaceAware(true);
final SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = sf.newSchema(new StreamSource(getClass().getResourceAsStream("/StrategicEmail5.xsd")));
documentBuilderFactory.setSchema(schema); …Run Code Online (Sandbox Code Playgroud) class example{
int[] quiz = new int[] { 10 , 20 }; //location 1
public static void main(String[] args) {
int[] test = new int[2]; // location 2
test[0] = 2;
test[1] = 3;
// other code
}
Run Code Online (Sandbox Code Playgroud)
上面的代码运行正常.但是,下面的代码会导致错误.我的错误推理是因为quiz在方法之外声明它需要立即初始化.但是我不确定这是否是正确的解释.
class example{
int[] quiz = new int[2]; //location of error
quiz[0] = 10;
quiz[1] = 20;
public static void main(String[] args) {
int[] test = new int[2]; // location 2
test[0] = 2;
test[1] = 3;
//other code
}
Run Code Online (Sandbox Code Playgroud)