Как создать копию Строкового класса?

Я должен создать класс с точно теми же методами как java.lang.String.

Что лучший способ состоит в том, чтобы сделать это в Java?

Я знаю, что не могу расширить Строковый класс, как это final. Я не смотрю на решения, где я должен скопировать исходный код java.lang.String. Например, предположите, что мне нужна функциональность length() в моем пользовательском названном классе MyString, который имеет соответствие 'myLength ()' метод.

Что состоит в том, чтобы реализовать лучший способ myLength()?

Я не смотрю на различные алгоритмы для обнаружения длины строки, но к повторному использованию String length() метод. Теперь, после того как я имею MyString готовый класс, я должен смочь использовать его где угодно для моих пользовательских манипуляций.

9
задан Dave Jarvis 18 January 2010 в 23:30
поделиться

8 ответов

С вашего вопроса звучит как то, что вы ищете, простой делегация :

class MyString {

  String delegate; // The actual string you delegate to from your class

  public MyString(String delegate) {
    this.delegate = delegate; // Assign the string that backs your class
  }

  int length() {
    return delegate.length(); // Delegate the method call to the string
  }

  // other methods that delegate to the string field
}
5
ответ дан 4 December 2019 в 06:57
поделиться

Я предполагаю, что вы имеете в виду Java.lang.String . Однако вы не можете заменить строку с вашим собственным классом. Вы можете сделать другой класс с одинаковыми методами (копируя исходный код и изменяя декларацию пакета), но вы не сможете пропустить экземпляры этого класса к методам, которые требуют строки .

, который поднимает важный вопрос: почему вы думаете, почему вы хотите сделать это?

3
ответ дан 4 December 2019 в 06:57
поделиться

Если вы просто хотите переопределить часть строкового поведения, вы можете попробовать использовать динамический прокси. Посмотрите на java.lang.reflect.proxy в API.

0
ответ дан 4 December 2019 в 06:57
поделиться

Сделать новый класс (конечно, понадобится другой пакет, реализовать тот же интерфейс и добавлять все публичные методы из класса String (прочитайте Javadoc, чтобы убедиться, что у вас все) [

Я должен предположить, что это домашнее задание.

-121--3224999-

С окончательных классов нельзя подклассу, создать новый класс, который имеет экземпляр string внутри и работает на этом объекте.

public class MyString {
  private String s;

  public MyString( String s ) {
    setInternalString( s );
  }

  public int myLength() {
    return getInternalString().length();
  }

  private void setInternalString( String s ) {
    this.s = s;
  }

  private String getInternalString() {
    return this.s == null ? "" : this.s;
  }
}
8
ответ дан 4 December 2019 в 06:57
поделиться

Позволяет сказать, что все ваши «переменные» на самом деле являются полями POCO (простой старый объект CLR, то есть объект, который служит только для хранения данных).

class State {
    public double pression_top;
    public double pression_bottom;
    /* hundreds and hundres of fields */
}

В этом случае можно сделать следующее:

var myState = new State();
var t = typeof(State);
foreach (var field in t.GetFields()) {
    field.SetValue(myState, 1);
}

Обратите внимание, что этот код не оптимизирован и не очень удобен для параллелизма.

-121--4648574-

То, что вы ищете, называется «файлы сценариев», определяется там: http://www.gnu.org/software/octave/doc/interpreter/Script-Files.html

-121--303017-

Proxy design образца, я полагаю. Это глупый вопрос, хотя (не размышление о просителе, а о человеке, который задал ему это на собеседовании). Возможно, человек, спрашивающий тебя, не понял, что Последовательность окончательная? Иначе я не могу подумать, зачем они вообще спрашивали.

3
ответ дан 4 December 2019 в 06:57
поделиться

Вы можете использовать рефакторинг: заменить наследование с делегированием , что в основном это (как показано в предыдущих ответах) для создания переменной экземпляра нужного типа и реализовать все его методы в новом классе и прохождение сообщение им.

Создайте поле для суперкласса, отрегулируйте методы для делегирования на суперкласс и снимите подклассы.

https://www.refactoring.com/catalog/repInherWithDel.gif

Вы заметите, что это много набрав, вот когда приходит хорошая IDE.

Следующее видео показывает, как Imexe Idea 9 делает это.

1
ответ дан 4 December 2019 в 06:57
поделиться

Сделать новый класс (конечно, понадобится другой пакет, реализует тот же интерфейс и добавить все общедоступные методы из класса String (прочитайте Javadoc, чтобы убедиться, что у вас все) [

Я должен предположить, что это домашнее задание.

2
ответ дан 4 December 2019 в 06:57
поделиться

здесь проходит различные ответы, а также обновления и разъяснений азерстов, кажется, что то, что хочет, - это класс, который выглядит, пахнет и звучит как строка, но нет.

То есть они хотели бы иметь возможность сделать:

MyString string = "String!!";

Это не может работать, поскольку java.lang.String - последний класс, и поэтому каждый string " То, что компилятор производит, будет объектом Java.lang.String , поскольку это не является объектом MyString , который они не могут быть назначены друг другу.

В слабо набранных языках вы сможете создать такой класс, поскольку если класс выглядит, пахнет и звучит как утка , то во всех целях и целях это утка. Java, однако, является сильно напечатанным языком, и утка - это только утка, если бы оно происходит из семейства птиц Anatidae .

11
ответ дан 4 December 2019 в 06:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: