我想创建一个类似String的类,即不需要new String("value");
。
例如:
public class Number { ... }
// main
Number num = 5;
有可能吗?
答案 0 :(得分:4)
简短的回答是否定的。
答案很长,你不会想要这种行为。
关于严格的OO语言的一个很酷的事情是你可以确保一个对象是一个对象... java的问题是它是一个基于类的语言,而不是一个OO语言...这导致像这样的奇怪
int myInt = 5; //primitive assignment.
这是一个值,它不是一个对象,也不符合对象在Java中所代表的标准。
Integer myInt = new Integer(5);
在内存中创建一个新对象,为其指定引用,然后通过引用发生此对象的任何“传递”。
有许多框架可以让你看到这个任务,但new
让你知道你正在创建一个全新的对象而不仅仅是一些随机的内存部分的值恰好是声明为整数位的字符串。
答案 1 :(得分:1)
new
关键字来缩短实例化代码。例如:
public class MyClass {
private MyClass(){
}
public static MyClass create(){
return new MyClass();
}
public static void main(String[] args) {
MyClass instance = MyClass.create(); // Add parameters as needed
}
}
它让我想起了像int b = Integer.parseInt("444");
这样的方法。在某些情况下,它使你的代码更具可读性。这真的取决于你的需求。此公共静态实例化也经常与单例getInstance()
方法一起使用。
答案 2 :(得分:0)
不,但如果您正在寻找语法替代方案,那么构造函数有一些替代方案,它们都有其应用。
枚举 - 不是你想要的。
静态工厂方法。
Rule x = Rules.def("abc");
Rule y = def("abc"); // Static import
public abstract class Rules { // Factory
public static Rule def(String s):
(不仅可以通过静态导入删除类名,还可以通过在超类中删除。)
class Grammar { protected Rule def(String s) { ... } }
Grammar g = new Grammar() {{
Rule x = def("abc");
}};
构建者,流畅的API
Grammar g = GrammarBuilder.grammar("Pascal")
.rule("S")
.seq()
.keyword("PROGRAM");
.nont("Decl")
.nont("Block")
.endseq()
.endrule()
.rule("Decl")
...
构建者,流畅的API
Grammar g = grammar("Pascal",
rule("S",
seq(
.keyword("PROGRAM");
.nont("Decl")
.nont("Block")
.endseq()
)),
rule("Decl",
...)
);
Java 8 lambdas分配给功能接口
Producer<String> x = () -> "beep";
x = () -> x.apply() + x.apply();
System.out.println(x.apply());