28

AddDefaultNamespace()Java の String クラスにメソッドを追加して、の"myString".AddDefaultNamespace()代わりに入力して、 のDEFAULTNAMESPACE + "myString"ようなものを取得したいと考えてい"MyDefaultNameSpace.myString"ます。別の派生クラスも追加したくありません(PrefixedStringたとえば)。

このアプローチはあなたにとって良くないかもしれませんが、私は個人的に+. とにかく、Java の String クラスに新しいメソッドを追加することは可能でしょうか?

ありがとうございます。

4

15 に答える 15

67

Stringこれは、独自の実装で動作するように拡張できないことを意味する最終クラスです。

于 2008-09-17T10:25:49.900 に答える
27

まあ、実際には誰もが想像力に欠けています。大文字と小文字を区別しないメソッドが必要だったため、独自のバージョンの startsWith メソッドを作成する必要がありました。

class MyString{
    public String str;
    public MyString(String str){
        this.str = str;
    }
    // Your methods.
}

次に、非常に簡単です。文字列を次のように作成します。

MyString StringOne = new MyString("Stringy stuff");

String ライブラリのメソッドを呼び出す必要がある場合は、次のように簡単に実行できます。

StringOne.str.equals("");

または同様のもの、そしてそれがあります... String クラスの拡張。

于 2011-07-24T11:09:13.633 に答える
19

他の誰もが指摘しているように、String を拡張することは許可されていません (final のため)。ただし、非常にワイルドな場合は、String 自体を変更して jar に配置し、bootclasspath の先頭に -Xbootclasspath/p:myString.jar を追加して、組み込みの String クラスを実際に置き換えることができます。

私が立ち入らない理由のために、私は実際にこれを以前にやったことがあります. クラスを置き換えることはできますが、Java のあらゆる面で String が本質的に重要であるということは、JVM の起動中に String が使用され、一部の変更によって JVM が壊れてしまうことを意味します。新しいメソッドやコンストラクターの追加は問題ないようです。新しいフィールドを追加するのは非常に危険です。特に、オブジェクトや配列を追加すると、プリミティブ フィールドを追加してもうまくいくように見えますが、問題が発生するようです。

于 2008-09-17T14:01:02.877 に答える
6

String は Java の最終クラスであるため、これは不可能です。

何かにプレフィックスを付けたい場合は、常にヘルパー メソッドを使用できます。それが気に入らない場合は、Groovy または Scala、JRuby または JPython の両方が Java と互換性のある JVM 用の言語であり、そのような拡張が可能です。

于 2008-09-17T10:27:42.390 に答える
3

クラス宣言は、最終的なものであるため継承できないため、ほとんどすべてを示しています。もちろん、独自の文字列クラスを実装することもできますが、それはおそらく面倒なことです。

public final class String

C# (.net 3.5) には拡張メソッドを使用する機能がありますが、残念ながら Java にはありません。nice http://nice.sourceforge.net/と呼ばれる Java 拡張機能がいくつかありますが、これは同じ機能を Java に追加するようです。

Nice 言語 (Java の拡張) で例を作成する方法は次のとおりです。

private String someMethod(String s)
{
   return s.substring(0,1);

}

void main(String[] args)
{
   String s1 = "hello";
   String s2 = s1.someMethod();
   System.out.println(s2);

}

ニースの詳細については、 http://nice.sf.netをご覧ください。

于 2008-09-17T10:34:45.290 に答える
2

不可能です。それは良いことです。文字列は文字列です。その振る舞いは定義されており、それから逸脱することは悪です。また、final とマークされているため、たとえサブクラス化したくてもサブクラス化できませんでした。

于 2008-09-17T10:29:20.703 に答える
2

他の誰もが言ったように、 String は最終的なものであるため、サブクラス化することはできません。しかし、次のようなものが役立つでしょうか?

public final class NamespaceUtil {

    // private constructor cos this class only has a static method.
    private NamespaceUtil() {}

    public static String getDefaultNamespacedString(
            final String afterDotString) {
        return DEFAULT_NAMESPACE + "." + afterDotString;
    }

}

または多分:

public final class NamespacedStringFactory {

    private final String namespace;

    public NamespacedStringFactory(final String namespace) {
        this.namespace = namespace;
    }

    public String getNamespacedString(final String afterDotString) {
        return namespace + "." + afterDotString;
    }

}
于 2008-09-17T10:47:34.357 に答える
1

メソッド append() を持ち、必要なジョブを実行する StringBuilder を使用することをお勧めします。String クラスは final であり、拡張できません。

于 2008-09-17T10:29:24.180 に答える
0

Java String クラスは final であるため、不変です。これは効率上の理由によるものであり、エラーなしで論理的に拡張することは非常に困難です。したがって、実装者は、継承で拡張できないことを意味する最終クラスにすることを選択しました。

クラスでサポートしたい機能は、単一の責任の原則に従って、文字列の通常の責任の一部ではありません。名前空間は別の抽象化であり、より専門化されています。したがって、 String メンバーを含み、必要な名前空間管理を提供するために必要なメソッドをサポートする新しいクラスを定義する必要があります。

抽象化 (クラス) を追加することを恐れないでください。これらは優れた OO 設計の本質です。

クラス責任コラボレーション (CRC) カードを使用して、 必要な抽象化を明確にして みてください。

于 2008-09-17T10:38:53.363 に答える
0

すべては他の寄稿者によって以前に言われています。String は final であるため、直接拡張することはできません。

Scala を使用する場合は、次のような暗黙の変換を使用できます。

object Snippet {
  class MyString(s:String) {
    def addDefaultNamespace = println("AddDefaultNamespace called")
  }
  implicit def wrapIt(s:String) = new MyString(s)

  /** test driver */
  def main(args:Array[String]):Unit = {
    "any java.io.String".addDefaultNamespace // !!! THAT is IT! OR?
  }
于 2010-01-16T14:11:19.477 に答える
-2

独自のバージョンの String クラスを作成し、メソッドを追加できます:-)

于 2008-09-17T10:39:01.320 に答える
-2

実際には、String クラスを変更できます。src.zip にある String.java ファイルを編集してから rt.jar を再構築すると、String クラスにさらにメソッドが追加されます。欠点は、そのコードがコンピュータ上でのみ機能すること、または String.class を提供し、デフォルトのクラスパスの前に配置した場合にのみ機能することです。

于 2008-09-17T10:41:39.173 に答える