5

私には夢があります....

この夢では、次のような構造を置き換えることができます。

if(aLongVariableName.equals(classInstance.aPropertyOfThatInstance) ||  
   aLongVariableName.equals(classInstance.aDifferentProperty)){  
    ...  
}

if(aLongVariableName.equals(classInstance.aDifferentProperty || aPropertyOfThatInstance)){ 
   ...  
}

後者の方が簡潔で読みやすいと思います。コンマpublic void readUnlimitedVariables(Variable ... vars)で区切られた変数を取るこの種の署名でメソッドを宣言できるので、何かが可能になるはずです(またはとは対照的に)。||&&

これは、ブール値を返すものなら何でも開くことができます。たとえば、次のようになります。

if(myLovelyInstance instanceof AwesomeClass && EpicClass){
    ...
}

myLovelyInstance実装する場所AwesomeClass && EpicClass

これはJavaで可能ですか?これまでのところ、グーグルまたはSOで何も見つかりませんでした。バニラ Java でない場合、これを許可する Lombok や lambdaJ などのサードパーティ パッケージはありますか? そうでない場合、これが言語の機能である場合はどうなりますか? 私には非常に直感的に思えますが、どこにも見たことがありません。

4

6 に答える 6

8

これはJavaで可能ですか?

いいえ。

||演算子は 2 つのブール オペランドを取ります。これを変更する方法はありません。Java では、演算子をオーバーロードしたり、他の方法で「言語構文を拡張」したりすることはできません。

あなたが得ることができる最も近いものは、次のように equals のオーバーロードを定義することです:

public boolean equals(Object ... others) {
    for (Object other: others) {
        if (this.equals(other)) {
            return true;
        }
    }
    return false;
}

次のように使用します。

if (aLongVariableName.equals(classInstance.aDifferentProperty,
                             classInstance.anotherProperty)) {
    ...  
}

...これは実際にはまったく近くありません。(そして、かなり悪い考えでもあります、IMO)

実際、あなたが提案しているものに類似した構文をサポートする言語は思いつきません。これが健全な構成であるためには、あいまいさの可能性が多すぎると思います。

于 2013-06-29T09:40:08.333 に答える
5

読みやすさのために、チェックの数が十分に少ない場合は、単純な変数のみを使用できます。

たとえば(どのタイプのオブジェクトでも同じ)

boolean isPDFFile  = extension.equalsIgnoreCase("PDF");
boolean isHTMLFile = extension.equalsIgnoreCase("html");

if (isPDFFile || isHTMLFile ) {
   // do your processing
}

文字列を使用する場合、正規表現は別の方法です。

if (extension.matches("PDF|HTML")) {
   // do your processing
}

シンプルさは賢さよりも優れている場合があります。

于 2013-06-29T10:11:15.763 に答える
3

悪い習慣のようなものを考えてもらえますか? (私は Java にかなり慣れていないので、ホイールを発明するか、単にブルシュ * t を作成するかもしれません:))

public class Main {
    public static <Type> boolean equalsVariadicOr(Type toComp, Type ... args) {
                for (Type arg : args) {
                        if (toComp.equals(arg)) {
                                return true;
                        }
                }
                return false;
        }

        public static <Type> boolean equalsVariadicAnd(Type toComp, Type ... args) {
                for (Type arg : args) {
                        if (!toComp.equals(arg)) {
                                return false;
                        }
                }
                return true;
        }

        public static void main(String args[]) {
                String testcaseAllA[]  = new String[] {"a", "a", "a", "a", "a", "a", "a", "a", "a", "a"};
                String testcaseWithB[] = new String[] {"b", "a", "a", "a", "a", "a", "a", "a", "a", "a"};
                System.out.println(equalsVariadicAnd("a", testcaseAllA));
                System.out.println(equalsVariadicAnd("b", testcaseWithB));
                System.out.println(equalsVariadicOr("b", testcaseWithB));
                System.out.println(equalsVariadicOr("a", testcaseAllA));
        }
}

答えがそうでない場合、OPはこれが役立つと思うでしょうか?

于 2013-06-29T09:48:45.753 に答える
2

varargs と Lombok の拡張メソッドで非常によく似たものを得ることができます:

  1. ユーティリティ クラスで次の静的メソッドを定義します。

    package test;
    
    public final class Util {
        private Util() {}
    
        public static boolean eqOr(Object tthis, Object ... those) {
            for (Object that : those) {
                if (tthis.equals(that)) return true;
            }
            return false;
        }
    
        public static boolean eqAnd(Object tthis, Object ... those) {
            for (Object that : those) {
                if (!tthis.equals(that)) return false;
            }
            return true;
        }
    }
    
  2. Lombokを使用しeqAndeqOr、拡張メソッドを作成します。

    package test;
    
    @lombok.experimental.ExtensionMethod({test.Util.class})
    public class Work {
      public static void main(String[] args) {
        System.out.println("a".eqOr("b", "c", "a"));
        System.out.println("a".eqOr("b", "c"));
        System.out.println("a".eqAnd("a", "a", "a"));
        System.out.println("a".eqAnd("a", "a", "c"));
      }
    }
    

    もちろん、lombok が気に入らない場合は、通常の静的メソッドと同じように使用できます。

于 2013-06-29T11:15:32.033 に答える
1

Javaではできません。の引数は s で||なければならず、決定するにはboolean遅すぎます。.equals両方の値を取得せず、boolean.

これを可能にするには、Java 言語の仕様を変更する必要があります。このような傾向は見られないので、Java の保守担当者に、これが欲しいと伝えてください。彼らがそれを受け入れたとしても、言語仕様にするのに何年もかかるかもしれませんし、ほとんどの Java インストールに展開されるまでに何年もかかるかもしれません。

于 2013-06-29T09:25:16.293 に答える
1

カプセル化を忘れないでください。

多くの場合、インスタンス メソッドを使用してコードをクリーンアップできます。

長くて紛らわしい if ステートメントの代わりに、次のようにします。

if (classInstance.matches(reallyLongVariableName)) {
    doStuff();
}

醜さをメソッドに埋めます:

class LongNamedObject {

    String propertyWithNameThatIsLong;
    String anotherLongNamedProperty;

    public boolean matches(String s) {
        return ( s.equals(propertyWithNameThatIsLong) ||
                 s.equals(anotherLongNamedProperty) );
    }
}

表現力豊かな名前でブール型メソッドを記述することは、コードを読みやすくする優れた方法です。

そのため、次のような混乱がよく見られます。

if (userInputFile != null && userInputFile.getAbolutePath() != null 
      && user != null && user.getAccessRules() != null 
      && userHasAccess(user, userInputFile) {
    doStuff();
}

次のようになります。

if (isValid(userInputFile, user)) {
    doStuff();
}

醜さをメソッドに埋めます:

private boolean isValid(File f, User u) {
    if (u == null || f == null) {
        return false;
    }
    if (f.getAbsolutePath() == null) {
        return false;
    }
    if (u.getAccessRules() == null) {
        return false;
    }
    return userHasAccess(u, f);
}
于 2013-06-29T10:14:09.263 に答える