Существует ли стандартный класс, который переносит ссылку и предоставляет метод получения и установки? - PullRequest
4 голосов
/ 09 августа 2009

Простите за глупый вопрос.

Я очень уверен, что Java API предоставляет класс, который переносит ссылку, и предоставляет геттер и сеттер к нему.

class SomeWrapperClass<T> {
    private T obj;

    public T get(){ return obj; }

    public void set(T obj){ this.obj=obj; }
}

Я прав? Есть ли что-то подобное в Java API?

Спасибо.

Да, я мог бы написать это сам, но почему я должен имитировать существующую функциональность?

РЕДАКТИРОВАТЬ: Я хотел использовать его для справки параметры (например, ключевое слово ref в C #) или более конкретные, уметь «записывать в параметры метода»;)

Ответы [ 8 ]

7 голосов
/ 09 августа 2009

Существует класс AtomicReference , который обеспечивает это. Он существует главным образом для обеспечения атомарности, особенно с помощью методов getAndSet () и compareAndSet (), но я думаю, он делает то, что вам нужно.

1 голос
/ 10 августа 2009

Когда я начал программировать на Java после многих лет написания C ++, меня беспокоил тот факт, что я не могу вернуть несколько объектов из функции.

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

Однако в реализации CORBA на Java используются одноэлементные массивы для передачи данных по ссылке. Это также работает с основными типами.

0 голосов
/ 10 августа 2009

Я думаю, что не существует Java API Class, разработанного для ваших целей, я также предпочел бы, чтобы ваш пример (класс Wrapper) затем использовал этот «трюк с массивами», потому что вы могли бы позже вставить несколько защитников или проверить несколько мыслей с помощью аспектов или отражение, и вы можете добавить функции, которые являются сквозной функциональностью.

Но будь уверен, что это то, что ты хочешь сделать! Может быть, вы могли бы изменить дизайн и прийти к другим решениям?

0 голосов
/ 10 августа 2009

Если вы пытаетесь вернуть несколько значений из функции, я бы создал класс Pair, Triple и & c, который действует как кортеж.

class Pair<A,B> {
A a;
B b;
public void Pair() { }
public void Pair(A a,B b) {
this.a=a;
this.b=b;
}
public void Pair( Pair<? extends A,? extends B> p) {
this.a=p.a;
this.b=p.b;
}
public void setFirst(A a) { this.a=a; }
public A getFirst() { return a; }
public void setSecond(B b) { this.b=b; }
public B getSecond() { return b; }
}

Это позволит вам вернуть 2 (технически бесконечные) возвращаемые значения

/* Reads a line from the provided input stream and returns the number of
 * characters read and the line read.*/
public Pair<Integer,String> read(System.in) {
...
}
0 голосов
/ 09 августа 2009

Я испытываю желание спросить, почему вы хотите один из них, но я предполагаю, что вы можете вернуть несколько объектов из функции ...

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

bool doStuff(int params, ... , SomeObject[] returnedObject)
{
    returnedObject[0] = new SomeObject();
    return true;
}

void main(String[] args)
{
    SomeObject myObject;
    SomeObject[1] myObjectRef = new SomeObject[1];
    if(doStuff(..., myObjectRef))
    {
        myObject = myObjectRef[0];
        //handle stuff
    }
    //could not initialize.
}
0 голосов
/ 09 августа 2009

Мне не ясно, для чего это нужно, но вы можете использовать один из подклассов типа Reference . Они устанавливают ссылку в конструкторе, а не в установщике.

Стоит отметить, что подклассы Reference в первую очередь предназначены для облегчения сбора мусора, например, при использовании вместе с WeakHashMap .

0 голосов
/ 09 августа 2009

... хороший вопрос, но не сталкивался с ним. Я бы проголосовал нет.

.... хм, после некоторого отражения, отражение может быть тем, что близко к нему: http://java.sun.com/developer/technicalArticles/ALT/Reflection/

0 голосов
/ 09 августа 2009

есть java.lang.ref.Reference , но оно неизменное (установщик отсутствует). Документация java.lang.ref гласит:

Каждый ссылочный объект предоставляет методы для получения и очистки ссылки. Помимо операции очистки, ссылочные объекты являются неизменными, поэтому операция set не предусмотрена. Программа может далее подклассировать эти подклассы, добавляя любые поля и методы, требуемые для ее целей, или она может использовать эти подклассы без изменений.

EDIT

void refDemo(MyReference<String> changeMe) {
   changeMe.set("I like changing!");
   ...

звонящий:

String iWantToChange = "I'm like a woman";
Reference<String> ref = new MyReference<String>(iWantToChange)
refDemo(myRef);
ref.get(); 

Мне не нравится, однако, слишком много кода. Этот вид функций должен поддерживаться на уровне языка, как в C #.

...