相关疑难解决方法(0)

比较Java枚举成员:==或equals()?

我知道Java枚举被编译为具有私有构造函数和一堆公共静态成员的类.当比较给定枚举的两个成员时,我总是使用.equals(),例如

public useEnums(SomeEnum a)
{
    if(a.equals(SomeEnum.SOME_ENUM_VALUE))
    {
        ...
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

但是,我刚刚遇到一些使用equals运算符==而不是.equals()的代码:

public useEnums2(SomeEnum a)
{
    if(a == SomeEnum.SOME_ENUM_VALUE)
    {
        ...
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

我应该使用哪个运营商?

java enums

1645
推荐指数
11
解决办法
62万
查看次数

关于null的可比较和比较者合同

Comparable合同规定e.compareTo(null)必须抛出NullPointerException.

来自API:

请注意,这null不是任何类的实例,并且e.compareTo(null)应该抛出一个NullPointerException偶数e.equals(null)返回false.

另一方面,ComparatorAPI没有提及比较时需要发生的事情null.考虑以下尝试采用a的泛型方法Comparable,并Comparator为其null作为最小元素返回.

static <T extends Comparable<? super T>> Comparator<T> nullComparableComparator() {
   return new Comparator<T>() {
      @Override public int compare(T el1, T el2) {
         return
            el1 == null ? -1 :
            el2 == null ? +1 :
            el1.compareTo(el2);
      }
   };
}
Run Code Online (Sandbox Code Playgroud)

这允许我们执行以下操作:

List<Integer> numbers = new ArrayList<Integer>(
   Arrays.asList(3, 2, 1, null, …
Run Code Online (Sandbox Code Playgroud)

java generics null comparable comparator

35
推荐指数
2
解决办法
2万
查看次数

Java:调用hashCode()和equals()时自动抛出UnsupportedOperationException的干净方法?

我们有一个OO代码库,在很多情况下hashcode()并且equals()根本不起作用,主要是由于以下原因:

除非您愿意放弃面向对象抽象的好处,否则无法扩展可实例化的类并在保留equals合同的同时添加值组件.

这是Joshua Bloch撰写的"Effective Java"的引用,在这篇伟大的Artima文章中有关于该主题的更多内容:

http://www.artima.com/lejava/articles/equality.html

我们完全没问题,这不是这个问题的意思.

问题是:看到事实上,在某些情况下你无法满足equals()合同,什么是自动制作hashcode()equals()抛出UnsupportedOperationException 的干净方法?

注释会起作用吗?我正在考虑这样的事情@NotNull:每次@NotNull合同违规都会自动抛出异常,除了用你的参数/返回值注释之外别无他法@NotNull.

它很方便,因为它是8个字符("@NotNull")而不是不断重复相同的验证/抛出异常代码.

在我关注的情况下,在每个hashCode()/equals()没有意义的实现中,我们总是重复同样的事情:

@Override
public int hashCode() {
    throw new UnsupportedOperationException( "contract violation: calling hashCode() on such an object makes no sense" );
}

@Override
public boolean equals( Object o ) {
    throw new UnsupportedOperationException( "contract violation: calling equals() on such an object makes no sense" );
}
Run Code Online (Sandbox Code Playgroud)

然而,这很容易出错:我们可能会忘记剪切/粘贴此内容,这可能会导致用户滥用此类对象(例如,尝试将它们放入默认的Java集合中).

或者,如果无法创建注释来创建此行为,AOP是否有效?

有趣的是,真正的问题是Java层次结构的存在hashCode()和 …

java design-by-contract equals

14
推荐指数
3
解决办法
6967
查看次数

比较两个对象,其中任何一个都可以为null

我在我的一个类中有一个函数,它将自己与同一个类的另一个实例进行比较 - 并找出哪些变量不同.这是为了最大限度地减少主数据库的网络负载(仅上传需要上传的数据,而不是上传整个对象).

为此,我一直在尝试使用该object.equals()函数来比较两个对象.

我很快就发现object.equals()它没有处理null,在看完这个问题之后,我理解为什么.

所以我破坏的代码示例如下:

public class MyObject {

    String myString;
    String myString2;

    public String getChangedVars(MyObject comparisonObj) {
        ArrayList<String> changedVars = new ArrayList<String>();

        if (!this.myString.equals(comparisonObj.myString))
            changedVars.add("myString");
        if (!this.myString2.equals(comparisonObj.myString2))
            changedVars.add("myString2");

        return changedVars.toString();
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是 - 基于被比较的变量中的任何一个可能为空,比较两个变量同时避免一个变量的简单方法是NullPointerException什么?

编辑:简单地检查两个对象上的null首先不能正常工作,因为我仍然希望比较对象是否有引用.例如,如果一个项目是null,而另一个项目不是,我希望这个解析为true,因为变量已经改变.

java

9
推荐指数
1
解决办法
4127
查看次数

null 和 equals 的对称性

平等应该是对称的,对吗?

Object someObject = new Object();
Object NULL = null;

NULL.equals(someObject) => NullPointerException
someObject.equals(NULL) => false
Run Code Online (Sandbox Code Playgroud)

不让第二种形式抛出 a的理由是什么NullPointerException

java null symmetric equals nullpointerexception

5
推荐指数
1
解决办法
1096
查看次数

容易出错的Java枚举重构

我正在重构一些旧的代码来使用enum's而不是String常量.我检讨我的代码时,我注意到,相比enumString将不会抛出异常.我无法删除旧常量,因为其他项目仍在使用它们.

我不能覆盖等于因为JLS特别禁止这个:

Enum中的equals方法是一个最终方法,它只在其参数上调用super.equals并返回结果,从而执行身份比较.

代码如下所示:

public enum Gender{
    MALE,
    FEMALE
}

// Constants for genders
public static final String MALE = "Male";
public static final String FEMALE = "Female";

//following are obviously false
MALE.equals(Gender.MALE) 
Gender.MALE.equals(MALE)
Run Code Online (Sandbox Code Playgroud)

对于常规对象,我可以覆盖equals并抛出异常,但对于我的示例,它将返回false.还有一个类似getGender的方法,它返回一个字符串,现在返回一个枚举,所以我可以错过一些地方,并将字符串与枚举进行比较

这很容易出错.FindBugs也没有报告任何错误.无论如何我可以防止这种情况吗?

java enums findbugs

2
推荐指数
1
解决办法
230
查看次数

Java中的空点异常

我在这段代码中遇到了一个奇怪的问题,当我使用第一个if条件执行代码时,它一切正常并且被视为已被删除.但是,当我评论if语句并使用另一个if条件(已经评论过的那个)时,它会给出NPE.getUserIP()和getPhoneNumber()都只是私有字符串的普通getter.并且两个值都是由普通的setter设置的.所以任何想法为什么会发生这种情况?谢谢.

public void sendBroadcast(final String broadcast) {
    System.out.println("entered sendBroadcast");

        String fullPeep=broadcast;
        System.out.println("fullPeep: "+fullPeep);
        String array[] = fullPeep.split("<!!>");

        for(User tempUser: friends)
        {
            if(tempUser.getUserIP().equals(this.getUserIP()))
            {
            System.out.println("tempuser:" +tempUser.getPhoneNumber() + " user: "+array[1] );
            //if(tempUser.getPhoneNumber().equals(array[1]))
            //{
                System.out.println("tempuser:" +tempUser.getPhoneNumber() + " user: "+array[1] );
                System.out.println("if statemnt of broadcast method");

            try {
                DataOutputStream out2= new DataOutputStream(socket.getOutputStream());
                out2=tempUser.getUserDataOutputStream();
                out2.writeUTF(fullPeep+"\n");
                out2.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }
            }
            //}
        }   
}


Exception in thread "Thread-6" java.lang.NullPointerException
at User.sendBroadcast(User.java:180)
at Server$ServerThread.run(Server.java:394)
Run Code Online (Sandbox Code Playgroud)

编辑:我弄清楚导致异常的原因以及为什么tempUser.getPhoneNumber()在某些时候返回null.谢谢大家.

java nullpointerexception dataoutputstream

-2
推荐指数
1
解决办法
1377
查看次数