2014-09-16 4 views
3

Я хочу создать класс, который работает как String, то есть не требуется new String("value");.
Например:Создайте конструктор, который принимает аргументы без 'new'

public class Number { ... } 

// main 
Number num = 5; 

Возможно ли это?

+4

Не с Java, подумайте о том, чтобы взглянуть на Scala. Этот язык может это сделать, и он работает на JVM тоже.Ближайшим, что может сделать Java, является автоматический бокс и строковые литералы, которые жестко связаны с компилятором. –

+1

@ChrisK Не класс String, написанный на Java, хотя? – Gofilord

+3

Да, класс String существует на Java, однако он обрабатывается компилятором Java как особый гражданин; который обрабатывает строковые литералы особым образом, который не может быть продублирован как чисто с уровня языка Java. Компилятор Java не поддерживает расширения для добавления собственного настраиваемого синтаксиса. Он поддерживает только конструкторы, методы, статические методы, наследование и т. Д. –

ответ

4

Короткий ответ - нет.

Долгий ответ, вы не хотели бы этого поведения.

Замечательная вещь о строгом языке OO - это то, что вы можете гарантировать, что объект является объектом ... проблема с java заключается в том, что это язык на основе класса и меньше языка OO ..., который вызывает такие странности, как это.

int myInt = 5; //primitive assignment. 

Это значение, оно не является объектом и не соответствует стандартам того, что представляет объект на Java.

Integer myInt = new Integer(5); 

создает новый объект в памяти, присваивая ссылку на него, а затем любой «проходит» этого объекта происходит путем ссылки.

Существует много фреймворков, которые могут дать вам видимость этого задания, но new позволяет вам узнать, что вы создаете совершенно новый объект, а не просто значение какой-либо случайной части памяти, которая, как считается, объявлена ​​как строка целых битов.

1

Как сказал Антони Джейкл, вы не можете. Но .. вы можете (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().

0

Нет, но если вы ищете синтаксические альтернативы, есть некоторые альтернативы конструкторам, которые имеют свое приложение.

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()); 
Смежные вопросы