Определение символов в классе java [duplicate]

@Milhous: десятичный формат округления превосходный:

Вы также можете использовать

DecimalFormat df = new DecimalFormat("#.00000");
df.format(0.912385);

, чтобы убедиться, что у вас есть конечные 0.

Я бы добавил, что этот метод очень хорош в обеспечении реального числового механизма округления - не только визуально, но и при обработке.

Гипотетическая: вам нужно реализовать округление в программу GUI. Чтобы изменить точность / точность результата, просто измените формат каретки (т. Е. В скобках). Так что:

DecimalFormat df = new DecimalFormat("#0.######");
df.format(0.912385);

вернется как результат: 0.912385

DecimalFormat df = new DecimalFormat("#0.#####");
df.format(0.912385);

вернется как результат: 0.91239

DecimalFormat df = new DecimalFormat("#0.####");
df.format(0.912385);

будет return в качестве выхода: 0.9124

[EDIT: также, если формат каретки похож на («# 0. ############»), и вы вводите десятичную, например 3.1415926, для аргументации, DecimalFormat не производит никакого мусора (например, конечных нулей) и вернет: 3.1415926 .. если вы так наклонены. Конечно, это немного многословно для симпатии некоторых разработчиков, но эй, у него низкий объем памяти во время обработки и очень легко реализуется.]

Таким образом, красота DecimalFormat заключается в том, что она одновременно обрабатывает внешний вид строки, а также уровень точности округления. Эрго: вы получаете два преимущества по цене одной реализации кода. ;)

149
задан teabot 6 November 2009 в 15:36
поделиться

9 ответов

Нет, Java не поддерживает пользовательскую перегрузку оператора. Единственный аспект Java, который близок к «пользовательской» перегрузке оператора, - это обработка + для строк, что либо приводит к конкатенации констант, либо времени выполнения, используя StringBuilder / StringBuffer. Вы не можете определить свои собственные операторы, которые действуют одинаково.

Для Java-подобного (и JVM-языка), который делает , поддерживает перегрузку оператора, вы можете посмотрите на Groovy . Кроме того, вы можете найти удачу с Java-компилятором плагина .

203
ответ дан Dor 22 August 2018 в 16:47
поделиться
  • 1
    Вы говорите, что мы не можем создать оболочку в java? Такие, как SmallInteger, как Integer? – huseyin tugrul buyukisik 12 September 2012 в 11:58
  • 2
    @ tuğrulbüyükışık: Уже есть обертки для всех существующих примитивных типов, но если вы хотите создать свой собственный новый тип обертки, вы не сможете заставить его вести себя как другие, поскольку они имеют определенную поддержку на этом языке. – Jon Skeet 12 September 2012 в 13:29
  • 3
    спасибо, я googled об этом и не смог найти. Я хотел знать, могу ли я сделать сложную переменную, состоящую из двух примитивов (двойная и прямая + хорошая точность + хороший диапазон) – huseyin tugrul buyukisik 12 September 2012 в 13:45
  • 4
    Было бы здорово, если бы команда Java добавила ее в Java 8 или что-то еще – Shaun Wild 11 May 2013 в 14:05
  • 5
    @djaqeel: Перегрузка оператора делает код менее читаемым при плохой работе . При использовании хорошо, он может значительно повысить удобочитаемость IMO. Посмотрите на код, который использует BigInteger в Java, а затем посмотрите на аналогичный код, используя BigInteger в C #, используя операторы. Я не вижу, как делегаты нарушают принципы ООП - вам нужно быть гораздо точнее, чем в ваших возражениях. Я не знаю подробностей о том, почему разработчики Java не включали в себя различные функции, но я подозреваю, что есть смесь давления ресурсов и желание сохранить язык небольшим и относительно простым. – Jon Skeet 15 May 2013 в 09:47

Можно попробовать перегрузку Java-оператора . Он имеет свои ограничения, но стоит попробовать, если вы действительно хотите использовать перегрузку оператора.

10
ответ дан Alexander Mironov 22 August 2018 в 16:47
поделиться

Просто используйте Xtend вместе со своим Java-кодом. Он поддерживает перегрузку оператора:

    package com.example;

@SuppressWarnings("all")
public class Test {
  protected int wrapped;

  public Test(final int value) {
    this.wrapped = value;
  }

  public int operator_plus(final Test e2) {
    return (this.wrapped + e2.wrapped);
  }
}

package com.example

class Test2 {

    new() {
        val t1 = new Test(3)
        val t2 = new Test(5)
        val t3 = t1 + t2
    }

}

На официальном сайте есть список методов для каждого оператора!

6
ответ дан Aurelien B 22 August 2018 в 16:47
поделиться

Или вы можете сделать Java Groovy и просто перегрузить эти функции, чтобы достичь того, что вы хотите

//plus() => for the + operator
//multiply() => for the * operator
//leftShift() = for the << operator
// ... and so on ...

class Fish {
    def leftShift(Fish fish) {
        print "You just << (left shifted) some fish "
    }
}


def fish = new Fish()
def fish2 = new Fish()

fish << fish2

Кто не хочет быть / использовать groovy? : D

Нет, вы не можете использовать скомпилированные groovy JARs в Java таким же образом. Это все еще ошибка компилятора для Java.

15
ответ дан Brian Agnew 22 August 2018 в 16:47
поделиться
  • 1
    Почему? – Brian Agnew 16 October 2013 в 20:53
  • 2
    Существует много других примеров перегрузки операторов в Java. Например, &, | и ^ являются перегрузками для boolean и целых типов. И действительно, арифметические и реляционные операторы перегружены для различных числовых типов. (Конечно, семантика перегрузок намного ближе ...) – Stephen C 13 November 2013 в 12:51

Как многие другие ответили: Java не поддерживает пользовательскую перегрузку оператора.

Возможно, это не по теме, но я хочу прокомментировать некоторые вещи, которые я прочитал в некоторых ответах.

О читаемости. Сравнить:

  1. c = a + b
  2. c = a.add (b)

Посмотрите еще раз! Какой из них более читабельен?

Язык программирования, который позволяет создавать пользовательские типы, должен позволять им действовать так же, как и встроенные типы (или примитивные типы).

Итак, Java нарушает фундаментальный принцип универсального программирования: Мы должны иметь возможность обменивать объекты встроенных типов с объектами определяемых пользователем типов. (Возможно, вам интересно: «Был ли он скажем, «объекты встроенного»? »Да, см. здесь .)

О конкатенации строк:

Математики используют symnol + для коммутативных операций на множествах. Поэтому мы можем быть уверены, что a + b = b + a. Конкатенация строк (в большинстве языков программирования) не учитывает эту общую математическую нотацию.

a := "hello";
b := "world";
c := (a + b = b + a);

или в Java:

String a = "hello";
String b = "world";
boolean c = (a + b).equals(b + a);

Дополнительно: обратите внимание, как в Java-равенстве и идентичности путают. Символ == (равенство) означает: a. Равенство для примитивных типов b. Проверка идентичности для пользовательских типов, поэтому мы вынуждены использовать функцию equals () для равенства. Но ... Как это связано с перегрузкой оператора? Если язык позволяет перегрузке оператора, пользователь может дать правильное значение оператору равенства.

6
ответ дан Fernando Pelliccioni 22 August 2018 в 16:47
поделиться
  • 1
    Символ == используется для равенства в Java, как в C и C ++. Это не имеет ничего общего с перегрузкой оператора. – Hot Licks 11 October 2014 в 01:01
  • 2
    Оператор ==, на Java только означает Equality для примитивных типов. Для пользовательских типов означает Identity. В C ++ семантика определяется пользователем, но должна сохранять встроенную семантику, равенство. Строка a = "hello"; Строка b = "привет"; boolean c = (a == b); – Fernando Pelliccioni 11 October 2014 в 02:23
  • 3
    Да, как и в C, которую копировала Java. Ваша фраза касается Java вообще и не имеет ничего общего с fact , что Java не поддерживает перегрузку оператора. Когда вы создаете свой собственный язык, вы можете определить его так, как вы пожелаете. – Hot Licks 11 October 2014 в 02:33
  • 4
    Так что вы сказали в своем первом комментарии неправильно. Правильно? Скажите, пожалуйста, как проверить равенство и личность на пользовательских типах в C. Вы правы, мой комментарий о равенстве - это OT, но я пояснил это (см. «Дополнительные»). Тот факт, что я не создал язык программирования, не означает, что я не могу критиковать существующий. Мне жаль, если вы видели критику как религиозную войну. – Fernando Pelliccioni 11 October 2014 в 08:00
  • 5
    Короче говоря: java сосет. – Kolya Ivankov 18 October 2017 в 13:39

Java не позволяет перегрузку оператора. Предпочтительным подходом является определение метода для вашего класса для выполнения действия: a.add(b) вместо a + b. Вы можете увидеть сводку остальных бит Java, оставшихся вне C-подобных языков здесь: Функции Удалены из C и C ++

17
ответ дан guest 22 August 2018 в 16:47
поделиться
  • 1
    Интересная ссылка – Wernsey 6 November 2009 в 11:38
  • 2
    Важнейшей задачей является создание независимого контекста исходных файлов Java. Попытка читать очень большой (MLOC), макросложные программы C имеют очень длинную кривую обучения. Сопоставимая (или более крупная) Java-программа не сложнее погрузиться, чем небольшая Java-программа. Как сказал Гослинг: «Язык для программистов с синими воротниками». [И любой, кто думает, что плитка многословия вредна, должна читать о разделении в экспертном познании.] – Tim Williscroft 12 September 2011 в 01:53
  • 3
    Благодаря oracle, ни одна из ссылок java.sun.com не работает. Можете ли вы дать обновленную ссылку, если это возможно? – Syed Aqeel Ashiq 1 November 2013 в 15:20

В дополнение ко всем людям, указывающим, что + перегружен для строк, - также перегружен для операций с плавающей запятой и целыми числами, как и * и /.

[edit] % также перегружен для плавающей запятой, что может быть неожиданностью для тех, у кого есть фон C или C ++.

22
ответ дан MSalters 22 August 2018 в 16:47
поделиться

Перегрузка оператора используется в Java для конкатенации типа String:

String concat = "one" + "two";

Однако вы не можете определить свои собственные перегрузки оператора.

32
ответ дан teabot 22 August 2018 в 16:47
поделиться
[g1] Вы не можете сделать это самостоятельно, поскольку Java не допускает перегрузки операторов. [/g1] [g2] За исключением [g0] одного [/g0] исключения. + и + = перегружены для строковых объектов. [/g2]
15
ответ дан Brian Agnew 5 November 2018 в 14:19
поделиться
  • 1
    Почему проголосовали? – Brian Agnew 16 October 2013 в 20:53
  • 2
    Есть много других примеров перегрузки операторов в Java. Например,
    class Program
    {
        delegate void D1();
        delegate string D2();
        static string X() { return null; }
        static void Y(D1 d1) {}
        static void Y(D2 d2) {}
        static void Main()
        {
            Y(X);
        }
    }
    
    ,
    void Q(Expression<Func<string>> f){}
    string M(int x) { ... }
    ...
    int y = 123;
    Q(()=>M(y++));
    
    и [f3] являются перегрузками для [f4] и целочисленных типов. И действительно, арифметические и реляционные операторы перегружены для различных числовых типов. (Конечно, семантика перегрузок гораздо ближе ...)
    – Stephen C 13 November 2013 в 12:51
Другие вопросы по тегам:

Похожие вопросы: