Я хочу создать класс, который работает как String, то есть не требуется new String("value");
.
Например:Создайте конструктор, который принимает аргументы без 'new'
public class Number { ... }
// main
Number num = 5;
Возможно ли это?
Я хочу создать класс, который работает как String, то есть не требуется new String("value");
.
Например:Создайте конструктор, который принимает аргументы без 'new'
public class Number { ... }
// main
Number num = 5;
Возможно ли это?
Короткий ответ - нет.
Долгий ответ, вы не хотели бы этого поведения.
Замечательная вещь о строгом языке OO - это то, что вы можете гарантировать, что объект является объектом ... проблема с java заключается в том, что это язык на основе класса и меньше языка OO ..., который вызывает такие странности, как это.
int myInt = 5; //primitive assignment.
Это значение, оно не является объектом и не соответствует стандартам того, что представляет объект на Java.
Integer myInt = new Integer(5);
создает новый объект в памяти, присваивая ссылку на него, а затем любой «проходит» этого объекта происходит путем ссылки.
Существует много фреймворков, которые могут дать вам видимость этого задания, но new
позволяет вам узнать, что вы создаете совершенно новый объект, а не просто значение какой-либо случайной части памяти, которая, как считается, объявлена как строка целых битов.
Как сказал Антони Джейкл, вы не можете. Но .. вы можете (kinda) сократить ваш код создания, не используя ключевое слово 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()
.
Нет, но если вы ищете синтаксические альтернативы, есть некоторые альтернативы конструкторам, которые имеют свое приложение.
Enums - не то, что вы ищете.
Статические методы завода.
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",
...)
);
Ja va 8 lambdas, назначаемые функциональным интерфейсам
Producer<String> x =() -> "beep";
x =() -> x.apply() + x.apply();
System.out.println(x.apply());
Не с Java, подумайте о том, чтобы взглянуть на Scala. Этот язык может это сделать, и он работает на JVM тоже.Ближайшим, что может сделать Java, является автоматический бокс и строковые литералы, которые жестко связаны с компилятором. –
@ChrisK Не класс String, написанный на Java, хотя? – Gofilord
Да, класс String существует на Java, однако он обрабатывается компилятором Java как особый гражданин; который обрабатывает строковые литералы особым образом, который не может быть продублирован как чисто с уровня языка Java. Компилятор Java не поддерживает расширения для добавления собственного настраиваемого синтаксиса. Он поддерживает только конструкторы, методы, статические методы, наследование и т. Д. –