Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Передача параметров по сслыке и значению / 13 сообщений из 13, страница 1 из 1
21.01.2017, 21:52
    #39388970
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров по сслыке и значению
Доброго дня господа !

Вопрос прост - необходимо выполнить процедуры и вернуть набор параметров
В частности tbMark,tmMark которые являются полями объекта и созданные внутри
процедуры конструктором.

Но возврат не происходит, пришлось дополнить ключом и кодом
if(Key==0) tmMark=Model; else tmCalc=Model;
if(Key==0) tbMark=Table; else tbCalc=Table;

Это неверно...
Насколько помню передача параметров по значению только для ПРОСТЫХ типов
(используем массив если ссылка) остальные типы в Jave передаются ссылке.
JTable, TableMark (польз. тип) - не есть простыми, но возврат не происходит
Подскажите как реализовать правильно .

Заранее благодарен !


CreateTable(0,tbMark,tmMark,rcMark);
CreateTable(1,tbCalc,tmCalc,rcCalc);

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
    private void CreateTable(int Key,JTable Table,TableMark Model,ArrayList<Mark> Record)
	{
   		Model = new TableMark(Record);
        Table = new JTable(Model) 
        {
        	MarkEditing cbCell = new MarkEditing(this);
        	public TableCellEditor getCellEditor(int row, int col)
            {
        		return (cbCell.mListEdit.get(row)==null)?super.getCellEditor(row,col):cbCell.mListEdit.get(row);
            }
        	{
                getTableHeader().setPreferredSize(new Dimension(25, 50));
        		getColumnModel().getColumn(4).setCellRenderer(new MarkRenderer());
            	for(int i=0;i<=2;i++)
            	{
            		TableColumn column=getColumnModel().getColumn(i);
            		column.setMinWidth(0);
            		column.setMaxWidth(0);
            		column.setWidth(0);
            		column.setPreferredWidth(0);
            	};
        	}
        };
		if(Key==0) tmMark=Model; else tmCalc=Model;  
		if(Key==0) tbMark=Table; else tbCalc=Table;  
	};
...
Рейтинг: 0 / 0
22.01.2017, 01:00
    #39388992
Kripke
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров по сслыке и значению
Проблема в том, что вы похоже не очень понимаете, что в java нет такого понятия, как out параметр (как например в PL/SQL).
То что в метод передается значение по ссылке, означает что внутри метода параметр будет ссылаться на тот же объект, на который ссылается аргумент в вызове (ссылка будет скопирована в параметр). Если параметру внутри метода присвоить другое значение, то это никак не повлияет на вызывающий метод, т.к. значение параметра это всего лишь копия переданного аргумента
На простом примере:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
public class MyClass {

    private Object obj;

    public void create(Object param) {
        // здесь param и obj ссылаются на один и тот же объект (или null)

        // после следующего вызова param ссылается на вновь созданный объект, а
        // obj не изменилась
        param = new Object();

        // после этого вызова obj будет тоже ссылаться на созданный в предыдущей
        // строке объект.
        obj = param;
    }

    public void test() {
        create(obj);
    }

}
...
Рейтинг: 0 / 0
22.01.2017, 06:07
    #39389001
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров по сслыке и значению
HOME_X,

https://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/mutable/Mutable.html] Interface Mutable<T> - Provides mutable access to a value

Class SummaryMutableBoolean A mutable boolean wrapper.MutableByte A mutable byte wrapper.MutableDouble A mutable double wrapper.MutableFloat A mutable float wrapper.MutableInt A mutable int wrapper.MutableLong A mutable long wrapper.MutableObject<T> A mutable Object wrapper.MutableShort A mutable short wrapper.
...
Рейтинг: 0 / 0
22.01.2017, 13:44
    #39389047
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров по сслыке и значению
Usman,

Параметры в Jave реально передаются только по значению
(другие утверждения ложны !!!!!!!)

Как можно выйти из положения ?
...
Рейтинг: 0 / 0
22.01.2017, 14:05
    #39389054
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров по сслыке и значению
HOME_XПараметры в Jave реально передаются только по значению
(другие утверждения ложны !!!!!!!)С этим согласен. (см. ответ Kripke)
HOME_XКак можно выйти из положения ?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
package ru.sql.example;

import org.apache.commons.lang3.mutable.MutableObject;

public class MutableObjects {
    
    public static void function(MutableObject<Object> obj) {
        obj.setValue("{" + obj.getValue() + "}");
    }

    public static void main(String[] args) {
        MutableObject<Object> obj = new MutableObject<>();
        Object[] arguments = { 
            "Hello, World!!!", Math.PI, Integer.MAX_VALUE, 'a' 
        };
        for (Object argument: arguments) {
            obj.setValue(argument);
            System.out.println("Before: " + obj.getValue());
            function(obj);
            System.out.println("After: " + obj.getValue());
        }
    }
}

вывод:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
Before: Hello, World!!!
After: {Hello, World!!!}
Before: 3.141592653589793
After: {3.141592653589793}
Before: 2147483647
After: {2147483647}
Before: a
After: {a}
...
Рейтинг: 0 / 0
22.01.2017, 14:09
    #39389056
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров по сслыке и значению
HOME_XUsman,

Параметры в Jave реально передаются только по значению
(другие утверждения ложны !!!!!!!)

Как можно выйти из положения ?
По ссылке они передаются, просто "по ссылке" в широком смысле - через указатель. То есть референсные параметры метода при вызове метода содержат адреса объектов, а не являются ссылками в их определении как именованная часть памяти. Соответственно, при записи меняется только значение самого указателя. Решается это очень просто и много как, например, передачей уже созданных объектов в вызов метода и тд.
...
Рейтинг: 0 / 0
22.01.2017, 15:06
    #39389063
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров по сслыке и значению
Не точно выразился в предыдущем посте, по факту в джава происходит следующее:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
void doSmth(Object localRef) {

}

и вызов:

Object ref = new Object();
doSmth(ref);

при вызове doSmth - неявное копирование параметров во внутренние для этого метода, тоесть:
localRef = ref;
далее выполняется само тело метода


Но это все-равно передача по ссылке, передача по значению - объект целиком бы копировался, а здесь копируется только указатель на него в локальную переменную метода. Вот так.
...
Рейтинг: 0 / 0
22.01.2017, 15:08
    #39389064
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров по сслыке и значению
HOME_XПараметры в Jave реально передаются только по значению
(другие утверждения ложны !!!!!!!)Для примитивов - это реальное значение, а для ссылочных типов -
значением является ссылка, которое мы тоже не можем изменить.

Из примера:
Код: java
1.
MutableObject<Object> obj

мы не можем изменить значение аргумента obj . Но мы можем изменить значение поля, которое определено в классе MutableObject<T> :
Код: java
1.
2.
/** The mutable value. */
private T value;

что мы и делаем при помощи методов:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
    @Override
    public T getValue() {
        return this.value;
    }

    @Override
    public void setValue(final T value) {
        this.value = value;
    }
...
Рейтинг: 0 / 0
22.01.2017, 16:09
    #39389082
Kripke
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров по сслыке и значению
Usman,

По-моему автору стоит разобраться с основами java и переписать свой код в нормальном виде. А не добавлять в это ад еще и MutableObject
...
Рейтинг: 0 / 0
22.01.2017, 18:35
    #39389114
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров по сслыке и значению
Спасибо за пояснения господа
Учту в дальнейшей разработке

Usman - благодарен за конкретный пример !

P.S. в своем случае изменил сигнатуру класса
...
Рейтинг: 0 / 0
23.01.2017, 09:26
    #39389292
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров по сслыке и значению
HOME_XПараметры в Jave реально передаются только по значению
(другие утверждения ложны !!!!!!!)
Вы немного заблуждаетесь.
Объект в java это всегда ссылка.
Соответственно строите обертку в виде объекта (хоть массива из одного элемента) и вуаля.
Правда и вызывающий должен оперировать этим объектом, а не прямой ссылкой.
...
Рейтинг: 0 / 0
23.01.2017, 10:37
    #39389348
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров по сслыке и значению
Сергей АрсеньевHOME_XПараметры в Jave реально передаются только по значению
(другие утверждения ложны !!!!!!!)
Вы немного заблуждаетесь.
Объект в java это всегда ссылка.
Соответственно строите обертку в виде объекта (хоть массива из одного элемента) и вуаля.
Правда и вызывающий должен оперировать этим объектом, а не прямой ссылкой.

Ну в том же PHP можно передать ссылку по ссылке, чтобы заменить ссылку из тела метода.

Код: php
1.
2.
3.
function test(&$class) {
    $class = new a('2');
}



Но это, мне кажется, не очень хорошо
...
Рейтинг: 0 / 0
23.01.2017, 11:01
    #39389371
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача параметров по сслыке и значению
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Передача параметров по сслыке и значению / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]