Java 相同的实例应该具有相同的引用

Java 相同的实例应该具有相同的引用,java,generics,fractions,bounded-wildcard,Java,Generics,Fractions,Bounded Wildcard,目前我有一个分数类,它允许我以三种不同的方式创建分数 对于一个整数,在这种情况下,给定的整数将是分子,分母将设置为1 有2个整数,分子和分母 最后一种方法是解析必须与正则表达式-?\d+/[1-9]\d匹配的字符串* 生成的分数将通过gcd尽可能减少 public class Fraction extends Number { public static final String REGEX = "-?\d+/[1-9]\d*"; public stat

目前我有一个分数类,它允许我以三种不同的方式创建分数

  • 对于一个整数,在这种情况下,给定的整数将是分子,分母将设置为1
  • 有2个整数,分子和分母
  • 最后一种方法是解析必须与正则表达式-?\d+/[1-9]\d匹配的字符串*
生成的分数将通过gcd尽可能减少

public class Fraction extends Number {

        public static final String REGEX = "-?\d+/[1-9]\d*";


        public static int gcd(int a, int b) {
          return b == 0 ? a : gcd(b, a % b);

        }


        public static Fraction parseFraction(String s) {
           if (!s.matches(REGEX)) {
              throw new RuntimeException("Parsing error");
           }
           String[] splitted = s.split("/");
           return new Fraction(Integer.parseInt(splitted[0]),
                   Integer.parseInt(splitted[1]));
        }

        private int numerator;

        private int denominator;


        public Fraction(int numerator) {
           this(numerator, 1);
        }


        public Fraction(int numerator, int denominator) {
           if (denominator == 0) {
              throw new RuntimeException("denominator == 0 is not  possible");
        }


       int gcd = Fraction.gcd(numerator, denominator);

       if (denominator / gcd < 0) {
         gcd *= -1;
       }

       this.numerator = numerator / gcd;

       this.denominator = denominator / gcd;
       }
     }
应该返回true

我看了一些关于泛型和边界的章节,但我不确定这是否是我所需要的正确方向。分数类是否应限定为字符串和整数

我现在想实现的是,具有相同分子和分母的分数实例具有相同的引用,例如

我想你的意思是在这里有相同的价值

您将遇到使用整数计算该值(以及使用浮点或双精度计算)的问题—弄清楚为什么这些事情很困难,以及如何减轻它们,将教会您很多东西


阅读String.intern()所做的事情(例如,这只是第一个Google结果:),然后做同样的事情,但是对于你的分数类。

通常你不需要==。你应该让分数彼此相等。你是说REGEX
-?\d+/[1-9]\d*
,用
\
而不是
/
?分数类是否应该限定为字符串和整数?不。泛型是一个编译时类型的安全系统,它不会帮助您解决创造性问题。您需要确保返回单个引用;第一部分几乎肯定是让构造函数
私有化
(或包私有化),并使用创造性模式。您需要填充(并维护)一个引用池。是的,-?\d+/[1-9]\d*是我的意思do@Trikalium然后编辑问题并修复正则表达式。
 *Fraction.parseFraction("1/2").equals(Fraction.parseFraction("2/4"))*