【问题标题】:Same instances should have same reference相同的实例应该有相同的引用
【发布时间】:2018-06-05 20:53:31
【问题描述】:

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

  • 对于一个整数,在这种情况下,给定的整数将是分子,分母将设置为 1
  • 有 2 个整数,分子和分母
  • 最后一种方法是解析必须与 REGEX 匹配的字符串 -?\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;
       }
     }

我现在要实现的是具有相同分子和分母的分数实例具有相同的参考,例如

 *Fraction.parseFraction("1/2").equals(Fraction.parseFraction("2/4"))*

应该返回真。

我查看了一些关于泛型和边界的章节,但我不确定这是否是我需要的正确方向。 Fraction 类是否应该绑定到 String 和 Integer?

【问题讨论】:

  • 一般不需要==。您应该以分数为 .equal 为目标。
  • 您的意思是正则表达式-?\d+/[1-9]\d*,用\ 代替//
  • Fraction 类是否应该绑定到 String 和 Integer? 不。泛型是一个编译时类型安全系统,不会帮助您了解什么是 creational 问题。 需要确保您返回单个引用;第一部分几乎肯定是让构造函数private(或包私有),并使用创建模式。您需要填充(并维护)一个引用池
  • 是的,-?\d+/[1-9]\d* 是我的本意
  • @Trikalium 然后编辑问题并修复正则表达式。

标签: java generics fractions bounded-wildcard


【解决方案1】:

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

我认为您的意思是这里的值相同?

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

阅读 String.intern() 的作用(例如,这只是 Google 的第一个结果:https://dzone.com/articles/string-interning-what-why-and),并做同样的事情,但要针对您的 Fraction 类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-02
    • 2015-01-02
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    相关资源
    最近更新 更多